【发布时间】:2020-02-25 00:13:21
【问题描述】:
我使用 TensorFlow 1.14.0 和 Keras 2.2.4。下面的代码实现了一个简单的神经网络:
import numpy as np
np.random.seed(1)
import random
random.seed(2)
import tensorflow as tf
tf.set_random_seed(3)
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.layers import Input, Dense, Activation
x_train=np.random.normal(0,1,(100,12))
model = Sequential()
model.add(Dense(8, input_shape=(12,)))
# model.add(tf.keras.layers.BatchNormalization())
model.add(Activation('linear'))
model.add(Dense(12))
model.add(Activation('linear'))
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(x_train, x_train,epochs=20, validation_split=0.1, shuffle=False,verbose=2)
20 个 epoch 后的最终 val_loss 为 0.7751。当我取消注释添加批量标准化层的唯一注释行时,val_loss 更改为 1.1230。
我的主要问题要复杂得多,但同样的事情也会发生。由于我的激活是线性的,所以我将批量标准化放在激活之后还是之前都没有关系。
问题:为什么批量标准化无济于事?有什么我可以改变的,以便批量标准化在不改变激活函数的情况下改善结果?
收到评论后更新:
具有一个隐藏层和线性激活的 NN 有点像 PCA。有很多关于这方面的论文。对我来说,这个设置在隐藏层和输出的所有激活函数组合中给出了最小的 MSE。
一些说明线性激活的资源意味着 PCA:
https://arxiv.org/pdf/1702.07800.pdf
https://link.springer.com/article/10.1007/BF00275687
https://www.quora.com/How-can-I-make-a-neural-network-to-work-as-a-PCA
【问题讨论】:
-
我似乎无法用 tensorflow 2.0 重现相同的行为。你使用的是 tensorflow 1.x 吗?
-
@kluu 是的,我使用 Tensorflow 1.14.0 和 Keras 2.2.4。你得到什么结果? BN 对你来说更好吗?
-
是的,BN 更好。使用完全相同的代码(除了 tensorflow 的种子设置器),我得到一个不带 BN 的
val_loss: 1.1346和带 BN 层的val_loss: 1.0833。 -
与该问题无关 (?),但仅由线性激活组成的 NN 没有多大意义(我非常怀疑是否有人尝试过使用这种配置的 BN)。
-
@desertnaut 我强烈反对。具有一个隐藏层和线性激活的 NN 有点像 PCA。有很多关于这方面的论文。对我来说,这个设置在隐藏层和输出的所有激活函数组合中给出了最小的 MSE。
标签: python keras neural-network batch-normalization