web-dev-qa-db-ja.com

Keras model.summary()result-パラメーターの数を理解する

Keras(Theanoバックエンド)を使用してpythonで記述された28x28pxイメージから手書き数字を検出するための簡単なNNモデルがあります。

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の合計パラメータに到達するのか、それが実際に何を意味するのか理解していませんか?

36
user3501476

パラメーターの数は7850です。これは、すべての非表示ユニットで、784個の入力ウェイトとバイアス付き接続のウェイトが1つあるためです。これは、すべての非表示ユニットが785個のパラメーターを提供することを意味します。 10個のユニットがあるので、合計で7850になります。

更新:

この追加のバイアス用語の役割は本当に重要です。モデルの容量が大幅に増加します。詳細を読むことができます。ここに :

ニューラルネットワークのバイアスの役割

27
Marcin Możejko

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(第2レイヤーのニューロン)+ 257(第2レイヤーのニューロンのバイアス値)として取得されます。

14

形状の「なし」は、事前定義された番号がないことを意味します。たとえば、トレーニング中に使用するバッチサイズにすることができます。また、値を割り当てないことで柔軟性を高め、バッチサイズを変更できるようにします。モデルは、レイヤーのコンテキストから形状を推測します。

各レイヤーに接続されたノードを取得するには、次を実行できます。

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

1つの層のニューロン数を計算する最も簡単な方法は次のとおりです。パラメータ値/(ユニット数* 4)

  • ユニットの数はpredictivemodel.add(Dense(514、...)にあります
  • Model.summary()関数のParam値はParamです

たとえば、 Paul Lo の回答では、1つのレイヤーのニューロンの数は264710 /(514 * 4)= 130です

0
user6596781

密なレイヤーの場合:

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
0
Ashiq Imran

パラメーターの数は、モデル内で変更できる数値の量です。数学的には、これは最適化問題の次元数を意味します。プログラマーにとって、このパラメーターはそれぞれ浮動小数点数であり、通常は4バイトのメモリーを必要とするため、保存後にこのモデルのサイズを予測できます。

この数値の式は、ニューラルネットワークレイヤータイプごとに異なりますが、高密度レイヤーの場合は簡単です。各ニューロンには、入力ごとに1つのバイアスパラメーターと1つの重みN = n_neurons * ( n_inputs + 1)があります。

0
mari.mts