2017-06-09 13 views
1

私はkerasで最初の畳み込みオートエンコーダーを作成しようとしていますが、レイヤー出力の形状に問題があります。私のコードがあります:Python、keras、Convolutional autoencoder

input_img = Input(shape=X_train.shape[1:]) 

x = Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))(input_img) 
x = MaxPooling2D(pool_size=(2, 2), padding='same')(x) 
x = Conv2D(16, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))(x) 
encoded = MaxPooling2D((2, 2), padding='same')(x) 

x = Conv2D(16, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))(encoded) 
x = UpSampling2D((2, 2))(x) 
x = Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))(x) 
x = UpSampling2D((2, 2))(x) 
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x) 

autoencoder = Model(input_img, decoded) 
print(autoencoder.summary()) 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 
autoencoder.fit(X_train, X_train, epochs=50, batch_size=32) 

と結果:

_________________________________________________________________ 
Layer (type)     Output Shape    Param 
================================================================= 
input_87 (InputLayer)  (None, 32, 32, 3)   0   
_________________________________________________________________ 
conv2d_327 (Conv2D)   (None, 32, 32, 3)   9248  
_________________________________________________________________ 
max_pooling2d_136 (MaxPoolin (None, 32, 16, 2)   0   
_________________________________________________________________ 
conv2d_328 (Conv2D)   (None, 16, 16, 2)   4624  
_________________________________________________________________ 
max_pooling2d_137 (MaxPoolin (None, 16, 8, 1)   0   
_________________________________________________________________ 
conv2d_329 (Conv2D)   (None, 16, 8, 1)   2320  
_________________________________________________________________ 
up_sampling2d_124 (UpSamplin (None, 16, 16, 2)   0   
_________________________________________________________________ 
conv2d_330 (Conv2D)   (None, 32, 16, 2)   4640  
_________________________________________________________________ 
up_sampling2d_125 (UpSamplin (None, 32, 32, 4)   0   
_________________________________________________________________ 
conv2d_331 (Conv2D)   (None, 1, 32, 4)   289  
================================================================= 
Total params: 21,121 
Trainable params: 21,121 
Non-trainable params: 0 
_________________________________________________________________ 
None 

そしてもちろんエラーの:

ValueError: Error when checking target: expected conv2d_331 to have shape (None, 1, 32, 4) but got array with shape (50000, 32, 32, 3) 

はあなたに私が間違ってやっている任意のアイデアをお持ちですか?なぜ最後のUpSampling2Dがその形状を返すのですか?

+0

https://stackoverflow.com/questions/47822154/layer-conv2d-3-w入力とは無関係に、象徴的なテンソルではありません。 –

答えて

1

だから、あなたのkerasがあなたの入力の最後の2次元は空間次元の代わりに、2番目と3番目として扱われることを意味するもの(バックエンドとしておそらくTheanochannel_firstにその画像寸法を設定しているようです。もう一つのことは、あなたの出力は、1の代わりに3のフィルタを使用しなければならないということです。これは、目標ディメンションの不一致に終わることになります。要約すると:

  1. を正しくあなたはどちらかtensorflowに切り替えてchannel_lastにチャンネルの順序を変更したりして、入力をトランスポーズする必要があなたの入力を設定するために:

    X = X.transpose([0, 3, 1, 2]) 
    
  2. 変更するには、次の行:

    decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x) 
    
+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25提案がありますか? –

関連する問題