2017-08-17 32 views
1

我有一些麻烦了解使用batchnormalization的DNN模型,在使用keras的详细说明中。有人可以向我解释我构建的这个模型中每一层的结构和内容吗?有关使用keras进行batening规范的dnn层的理论问题

modelbatch = Sequential() 
modelbatch.add(Dense(512, input_dim=1120)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('relu')) 
modelbatch.add(Dropout(0.5)) 

modelbatch.add(Dense(256)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('relu')) 
modelbatch.add(Dropout(0.5)) 

modelbatch.add(Dense(num_classes)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('softmax')) 
# Compile model 
modelbatch.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 
# Train the model 
start = time.time() 
model_info = modelbatch.fit(X_2, y_2, batch_size=500, \ 
         epochs=20, verbose=2, validation_data=(X_test, y_test)) 
end = time.time() 

这一点,我想,我的模型的所有层:

print(modelbatch.layers[0].get_weights()[0].shape) 
(1120, 512) 
print(modelbatch.layers[0].get_weights()[1].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[0].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[1].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[2].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[3].shape) 
(512,) 
print(modelbatch.layers[4].get_weights()[0].shape) 
(512, 256) 
print(modelbatch.layers[4].get_weights()[1].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[0].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[1].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[2].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[3].shape) 
(256,) 
print(modelbatch.layers[8].get_weights()[0].shape) 
(256, 38) 
print(modelbatch.layers[8].get_weights()[1].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[0].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[1].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[2].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[3].shape) 
(38,) 

我会感谢您的帮助,在此先感谢。

回答

0

让我们通过模型:

您有尺寸1120的输入层,连接到一个,你有512元的第一隐藏层,你有你的批标准化层之后。之后,你的激活功能和之后,你的失落层。请注意,您可以使用命令model.summary()可视化您的模型

理论上,您可以(也应该)只考虑这些图层,就像应用以下转换的一个图层:批量标准化,激活和丢弃。在实践中,每个图层都是在Keras中单独实现的,因为您可以通过模块化获得实现:不用编码设计图层的所有可能方式,用户可以选择添加到图层批处理标准或退出。若要查看模块化实施方案,我建议您查看http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf,如果您想获得更深入的知识,则一般需要登录http://cs231n.stanford.edu/syllabus.html

对于批处理标准化层,您可以注意到4个参数:两个可调参数:gamma和beta以及两个由数据设置的参数(平均值和标准偏差)。要了解它是什么,请查看斯坦福大学的课程,还可以在关于批次标准化https://arxiv.org/abs/1502.03167的原始论文中找到它。这只是一个技巧,通过在每一层对数据进行规范化来提高学习速度并提高准确性,就像您在输入数据的预处理步骤中所做的一样。

从我所说的,你可以推断出你的模型的其余部分。

N-B:我不会在softmax之前的最后一步使用batchnormalization图层。

更清楚了吗?

+0

是的,谢谢,它更清晰,但只是批量标准化的4个参数,我不知道是否可以用另一个数据来评估(如何知道,可以将模型保存在keras中或如果是简单的DNN,你可以通过model.layers.get_weights()来获取权重和偏差来评估另一个数据),所以,我希望做同样的事情,在这种情况下使用批量规范化,但我不知道所有图层中的哪一个需要在另一个环境中进行评估?提前致谢! –

+0

您的意思是您希望使用您学习的模型在没有Keras API的情况下进行预测,并且您想将所有权重和体系结构复制到其他项目中? – Nathan

+0

是的,就像用一个简单的DNN例子一样,我得到这个权重:'weights1 = modelbatch.layers [0] .get_weights()[0]'#1隐藏层 'biases1 = ...' '权重2 = modelbatch.layers [1] .get_weights()[0]'#The 2 hidden layer 'biases2 = .....' 'weights3 = modelbatch.layers [4] .get_weights()[0]'#The输出层 'biases3 = ....' –