前提・実現したいこと
現在pythonでkerasを用いた畳み込みオートエンコーダの学習モデル作成に取り組んでいます.
その際に圧縮したデータを抽出するためのencoderモデルと全体のautoencoderモデルはそれぞれ作成・保存できたのですが,圧縮データを復元するためのdecoderモデルの作成で下記のエラーメッセージが表示されてしまいます.
layerの扱い等々まだまだ勉強途中でして,ネットで調べてみても解決方法を見つけられませんでした.
エラーの解決方法,decoderモデルの作成方法等,ご教授のほどよろしくお願い致します.
発生している問題・エラーメッセージ
Traceback (most recent call last): File "XXXXXX.py", line YYY, in <module> decoder = Model(input=encoded_input, output=decoder_layer(encoded_input)) TypeError: 'list' object is not callable
該当のソースコード(抜粋)
Python
1# レイヤー定義 2 input_img = Input(shape=(20, 20, 1)) 3 x = Convolution2D(32, 3, 3, activation=Act[i], border_mode='same')(input_img) 4 x = Convolution2D(16, 3, 3, activation=Act[i], border_mode='same')(x) 5 x = MaxPooling2D((2, 2), border_mode='same')(x) 6 x = Convolution2D(16, 3, 3, activation=Act[i], border_mode='same')(x) 7 x = Convolution2D(4, 3, 3, activation=Act[i], border_mode='same')(x) 8 9 x = Convolution2D(1, 3, 3, activation=Act[i], border_mode='same')(x) 10 encoded = MaxPooling2D((2, 2), border_mode='same')(x) 11 12 x = Convolution2D(4, 3, 3, activation=Act[i], border_mode='same')(encoded) 13 x = Convolution2D(16, 3, 3, activation=Act[i], border_mode='same')(x) 14 x = UpSampling2D((2, 2))(x) 15 x = Convolution2D(16, 3, 3, activation=Act[i], border_mode='same')(x) 16 x = Convolution2D(32, 3, 3, activation=Act[i], border_mode='same')(x) 17 x = UpSampling2D((2, 2))(x) 18 decoded = Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same')(x) 19# モデル作成 20 autoencoder = Model(input_img, decoded) 21 encoder = Model(input_img, encoded) 22# デコーダ部分のモデル作成 23 encoded_input = Input(shape=(5, 5, 1)) 24 decoder_layer = autoencoder.layers[-7:] 25 decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))
試したこと
decoder_layer = autoencoder.layers[-7:]
のスライス部分をいろいろ変えてみた.
decoder_layer = autoencoder.layers[-1]
のようにしてみると通ったが,decoderに用いたいのは[-7:]の範囲.
追記
閲覧,コメント等いただいた皆様
少し冗長ではありますが,以下のような手段でデコーダ部分のレイヤーを取得すると,エラーなく実行できました.
復元結果はまだ数値をざっと見比べる程度でしか確認していませんが,おそらくデコーダとして正しく機能できていると思われます.
encoded_input = Input(shape=(5, 5, 1)) decoder_layer1 = autoencoder.layers[-7] decoder_layer2 = autoencoder.layers[-6] decoder_layer3 = autoencoder.layers[-5] decoder_layer4 = autoencoder.layers[-4] decoder_layer5 = autoencoder.layers[-3] decoder_layer6 = autoencoder.layers[-2] decoder_layer7 = autoencoder.layers[-1] decoder_layer =decoder_layer7(decoder_layer6(decoder_layer5(decoder_layer4(decoder_layer3(decoder_layer2(decoder_layer1(encoded_input))))))) decoder = Model(input=encoded_input, output=decoder_layer)
もっとスマートな方法をご存知の方いらっしゃいましたら是非アドバイスいただければ幸いです.
あなたの回答
tips
プレビュー