批处理规范化的主要目标是其更快的优化速度。为了确认这一点,我创建了一个带有和不带有批处理规范化的模型,如下所示;
无BN:
model=Sequential()
model.add(Dense(units=1,activation='linear',use_bias=False,kernel_initializer=init_1,input_shape=(28,28,1),trainable=False))
model.add(Flatten())
model.add(Dense(units=1024,kernel_initializer=init_2))
model.add(Activation(activation='relu'))
model.add(Dense(units=10,kernel_initializer=init_2))
model.add(Activation(activation='softmax'))
使用BN:
model=Sequential()
model.add(Dense(units=1,activation='linear',use_bias=False,kernel_initializer=init_1,input_shape=(28,28,1),trainable=False))
model.add(Flatten())
model.add(Dense(units=1024,kernel_initializer=init_2))
model.add(BatchNormalization())
model.add(Activation(activation='relu'))
model.add(Dense(units=10,kernel_initializer=init_2))
model.add(Activation(activation='softmax'))
然后按照如下所示对模型进行编译和训练以增强数据;
opt=optimizers.Adam(learning_rate=0.001)
model.compile(optimizer=opt,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit_generator(iter,steps_per_epoch=np.ceil(len(X_train)/64),epochs=30)
令我惊讶的是,我发现模型没有BN收敛更快。
为进一步确认发现,我通过改变隐藏层中的单元数进行了尝试,并得到了以下结果(这次使用fit()方法而不是fit_generator()并使用原始数据而不是扩充数据) ;
从图中可以看出,该模型在不进行批量归一化的情况下收敛速度似乎更快,并且比归一化所实现的精度更高。
请帮助我找出我在哪里做错了。谢谢。