2017-06-08 7 views
5

(チュートリアルのunclarity)Kerasに深いオートエンコーダからの符号化データをデコードする方法: https://blog.keras.io/building-autoencoders-in-keras.htmlは、私はチュートリアル「Kerasでビルオートエンコーダを」従っている

まず、簡単な、解決策が正常に動作します。しかし、「Deep autoencoder」のセクションでは、チュートリアルで提供されているコードは完全に機能していないようです。ここで

はちょうどturorialからコピーされた私のコード(問題が表示される場所だけになるまで)、次のとおりです。

from keras.layers import Input, Dense 
from keras.models import Model 

encoding_dim = 32 

input_img = Input(shape=(784,)) 
encoded = Dense(128, activation='relu')(input_img) 
encoded = Dense(64, activation='relu')(encoded) 
encoded = Dense(32, activation='relu')(encoded) # Multiple encoding 
decoded = Dense(64, activation='relu')(encoded) # and decoding layers. 
decoded = Dense(128, activation='relu')(decoded) 
decoded = Dense(784, activation='sigmoid')(decoded) 

autoencoder = Model(input_img, decoded) 

encoder = Model(input_img, encoded) 

encoded_input = Input(shape=(encoding_dim,)) 
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here. 

私はこのエラーを取得する:

Traceback (most recent call last): 
    File "keras_test.py", line 20, in <module> 
    decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 569, in __call__ 
    self.assert_input_compatibility(inputs) 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 479, in assert_input_compatibility 
    ' but got shape ' + str(x_shape)) 
ValueError: Input 0 is incompatible with layer dense_6: expected axis -1 of input shape to have value 128 but got shape (None, 32) 

私はdecoderであると推測しています誤った復号化レイヤに接続されている、および/またはその入力または出力の形状が間違っていることがある。しかし、私はそれについて何をすべきですか?

decoderは、autoencoderには必要ありません。チュートリアルの残りの部分で学習を行い、画像をエンコードすることができます。しかし、decoderがなければ、イメージを元の形式に戻して、実際に見栄えが良いかどうかを確認することはできません。このチュートリアルでは何も言及しておらず、解読された画像を単語なしで示しています。私は作者がこれを達成するために彼が何をしたのかと思ったのですが、これを実現するには些細なことでした。

明確にする:単層のバージョンが正常に動作します。ここで、代わりに3エンコードとデコード3層から私達はちょうど

encoded = Dense(32, activation='relu')(input_img) 
decoded = Dense(784, activation='sigmoid')(encoded) 

を持っており、他のすべてが上記のように同じです。その後、エラーは発生せず、decoderを使用してイメージを再作成できます。最後の層は、この行が最後の層を要求する。この場合にデコーダと

decoder_layer = autoencoder.layers[-1] 

あるため

+0

こんにちはPaulMag;あなたの質問はコード関連で、Kerasモデルの設定をデバッグすることだと思います。統計や深い学習のテクニックではありません。そうであれば、CrossOverflowではなく、StackOverflowの「ミッション」に局所的に関連しています。 – fnl

+0

@fnlはい、あなたは正しいです。私はこれを求めるプラットフォームが不明であった。私はStackOverflowでそれを再投稿し、CrossValidatedから削除する必要がありますか? – PaulMag

+1

私は、移行が問題だと考えました。私はStackOverflowへの移行のためにこの質問にフラグを立てました。 – PaulMag

答えて

11
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) 

このコードは、単層のために働きます。

3層エンコーダとデコーダの場合、デコーダを定義するには3つのレイヤすべてを呼び出す必要があります。 私は同じチュートリアルをしていたので、私はこのようなコードを書いています。

encoded_input = Input(shape=(encoding_dim,)) 

deco = autoencoder.layers[-3](encoded_input) 
deco = autoencoder.layers[-2](deco) 
deco = autoencoder.layers[-1](deco) 
# create the decoder model 
decoder = Model(encoded_input, deco). 

これで正常に動作します。

+0

ありがとうございます。それは理にかなっていますが、私は推測しませんでした。私たちはすでにそれらの層を一緒に結んでいると思いました。これはチュートリアルの大きな穴です。 – PaulMag

関連する問題