我有一个简单的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总参数以及这实际意味着什么?
答案 0 :(得分:22)
参数数量为7850,因为每个隐藏单位都有784个输入权重和一个权重与偏差连接。这意味着每个隐藏单元都会为您提供785个参数。你有10个单位,所以总计达到7850.
更新:
这个额外偏见词的作用非常重要。它显着增加了模型的容量。你可以阅读细节,例如在这里:
答案 1 :(得分:13)
我将一个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
________________________________________________________________
对于dense_1层,参数的数量是264710。 这获得如下:514(输入值)* 514(第一层中的神经元)+ 514(偏差值)
对于dense_2层,参数的数量是132355。 获得如下:514(输入值)* 257(第二层中的神经元)+ 257(第二层中神经元的偏差值)
答案 2 :(得分:3)
" none"形状意味着它没有预定义的数字。例如,它可以是您在培训期间使用的批量大小,并且您希望通过不为其分配任何值来使其灵活,以便您可以更改批量大小。模型将根据图层的上下文推断出形状。
要获取连接到每个图层的节点,您可以执行以下操作:
for layer in model.layers:
print(layer.name, layer.inbound_nodes, layer.outbound_nodes)
答案 3 :(得分:0)
计算一层神经元数量的最简单方法是: 参数值/(单位数* 4)
例如在Paul Lo的答案中,一层神经元的数量是264710 /(514 * 4)= 130
答案 4 :(得分:0)
参数数量是可以在模型中更改的数量。从数学上讲,这意味着优化问题的维度。对于程序员来说,每个参数都是一个浮点数,通常占用4个字节的内存,使您可以在保存后预测此模型的大小。
此数字的公式对于每种神经网络层类型都不同,但是对于密集层来说很简单:每个神经元具有一个偏差参数和每个输入一个权重:
N = n_neurons * ( n_inputs + 1)
。
答案 5 :(得分:0)
对于密集层:
output_size * (input_size + 1) == number_parameters
对于转换层:
output_channels * (input_channels * window_size + 1) == number_parameters
考虑以下示例,
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
Conv2D(64, (3, 3), activation='relu'),
Conv2D(128, (3, 3), activation='relu'),
Dense(num_classes, activation='softmax')
])
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 222, 222, 32) 896
_________________________________________________________________
conv2d_2 (Conv2D) (None, 220, 220, 64) 18496
_________________________________________________________________
conv2d_3 (Conv2D) (None, 218, 218, 128) 73856
_________________________________________________________________
dense_9 (Dense) (None, 218, 218, 10) 1290
=================================================================
计算参数
assert 32 * (3 * (3*3) + 1) == 896
assert 64 * (32 * (3*3) + 1) == 18496
assert 128 * (64 * (3*3) + 1) == 73856
assert num_classes * (128 + 1) == 1290