Keras model.summary()result-了解参数

2024-04-24 01:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的NN模型,用于使用Keras(Theano后端)从用python编写的28x28px图像中检测手写数字:

model0 = Sequential()

#number of epochs to train for
nb_epoch = 12
#amount of data each iteration in an epoch sees
batch_size = 128

model0.add(Flatten(input_shape=(1, img_rows, img_cols)))
model0.add(Dense(nb_classes))
model0.add(Activation('softmax'))
model0.compile(loss='categorical_crossentropy', 
         optimizer='sgd',
         metrics=['accuracy'])

model0.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      verbose=1, validation_data=(X_test, Y_test))

score = model0.evaluate(X_test, Y_test, verbose=0)

print('Test score:', score[0])
print('Test accuracy:', score[1])

运行良好,我得到约90%的准确率。然后,我执行以下命令,通过执行print(model0.summary())来获得网络结构的摘要。这将输出以下结果:

Layer (type)         Output Shape   Param #     Connected to                     
=====================================================================
flatten_1 (Flatten)   (None, 784)     0           flatten_input_1[0][0]            
dense_1 (Dense)     (None, 10)       7850        flatten_1[0][0]                  
activation_1        (None, 10)          0           dense_1[0][0]                    
======================================================================
Total params: 7850

我不明白他们是怎么得到7850个参数的,这到底意味着什么?


Tags: oftotestnoneadddatasizebatch
3条回答

参数的数目是7850,因为每个隐藏单元有784个输入权重和一个与偏差相关的权重。这意味着每个隐藏的单元都会给你785个参数。你有10个单位,所以总数是7850。

这个附加的偏倚项的作用非常重要。它显著增加了模型的容量。你可以在这里阅读细节。

我将514维实值输入馈送到Keras中的Sequential模型。 我的模型是按以下方式构建的:

    predictivemodel = Sequential()
    predictivemodel.add(Dense(514, input_dim=514, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal'))
    predictivemodel.add(Dense(257, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal'))
    predictivemodel.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

当我打印model.summary()时,得到以下结果:

Layer (type)    Output Shape  Param #     Connected to                   
================================================================
dense_1 (Dense) (None, 514)   264710      dense_input_1[0][0]              
________________________________________________________________
activation_1    (None, 514)   0           dense_1[0][0]                    
________________________________________________________________
dense_2 (Dense) (None, 257)   132355      activation_1[0][0]               
================================================================
Total params: 397065
________________________________________________________________ 

对于稠密层,参数的数目为264710。 得到的结果是:514(输入值)*514(第一层神经元)+514(偏差值)

对于致密层,参数为132355。 得到的结果是:514(输入值)*257(第二层神经元)+257(第二层神经元的偏差值)

形状中的“无”表示它没有预定义的数字。例如,它可以是您在培训期间使用的批大小,您希望通过不为其分配任何值来使其具有灵活性,以便您可以更改批大小。模型将根据图层的上下文推断形状。

要将节点连接到每个层,可以执行以下操作:

for layer in model.layers:
    print(layer.name, layer.inbound_nodes, layer.outbound_nodes)

相关问题 更多 >