2017-10-15 14 views
0

私は、テンソルフローバックエンドを使用して、Keras 2.0.8を使用してCNNを作成しています。私は、以下に示すように、第1の畳み込み層の重み行列を取得しようとしている:keras Conv2d重み行列のサイズが逆になりました。

model = Sequential() 
model.add(Conv2D(filters=16, kernel_size=(3,3), 
        input_shape= 
(9,9,1),activation='relu',kernel_regularizer =l2(regularization_coef))) 

model.add(Conv2D(filters=64, kernel_size= 
(3,3),activation='relu',kernel_regularizer = l2(regularization_coef))) 

model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.5)) 

model.add(Flatten()) 
model.add(Dense(128,activation='relu',kernel_regularizer = 
l2(regularization_coef))) 

model.add(Dropout(0.5)) 
model.add(Dense(2,activation='softmax',kernel_regularizer = 
l2(regularization_coef))) 

model.compile(loss='categorical_crossentropy', 
optimizer='adadelta',metrics=['accuracy']) 
model.summary() 

model.fit(X_train, Y_train, batch_size=batch_size, epochs=nb_epoch, 
verbose=0, validation_split=0.1) 

score = model.evaluate(X_test, Y_test, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

filters= model.layers[0].get_weights()[0] 
print(filters.shape) 

あなたが見ることができるように第1の層は、カーネルサイズ(3,3)の、16個のフィルタと2D畳み込み層であり、 1入力チャンネル。だから最後の行は私に(16,1,3,3)の形を与えるはずですが、代わりに(3,3,1,16)の形を得ます。私は重みを16 3×3行列として視覚化したいが、この形状問題のためにこれを行うことはできない。 誰かが私を助けてくれますか? ありがとうございます!

答えて

1

配列を転置して16を先頭に移動し、それを(16,3,3)に再整形することができます。

filters= model.layers[0].get_weights()[0] 
print(filters.shape) 
# (3,3,1,16) 
filters = filters.transpose(3,0,1,2) 
print(filters.shape) 
# (16, 3, 3, 1) 
filters = filters.reshape((16,3,3)) 
print(filters.shape) 
# (16, 3, 3) 
+0

ありがとうございます。だから私はこれを正しく行うことができますか? 'filters = filters.transpose(3,2,0,1) print(filters.shape)#(16,1,3,3)' – abhih1

関連する問題