我使用Tensorflow 1.14.0和Keras 2.2.4。以下代码实现了一个简单的神经网络:
在20个epoch之后,最终的val_loss为0.7751。当我取消唯一的注释行以添加批归一化层时,val_loss会变为1.1230。
我的主要问题更加复杂,但是发生了同样的事情。由于我的激活函数是线性的,因此无论我在激活函数之前还是之后放置批归一化,都没有关系。
问题:为什么批归一化不能帮助?有没有什么方法可以改变,使得批归一化在不改变激活函数的情况下改善结果?
在得到评论后更新:
具有一个隐藏层和线性激活的NN有点像PCA。有很多关于这个的论文。对我来说,这种设置在隐藏层和输出的所有激活函数组合中给出了最小的MSE。
一些资源表明线性激活意味着PCA:
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