質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1508閲覧

KerasのInstanceNormalizationがエラー

abshaiaiouysu

総合スコア7

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/18 06:48

編集2018/06/18 07:14

前提・実現したいこと

keras_contribにあるInstanceNormalizationを
通常のBatchNormalizationの代わりに使って
ResidualBlockを作りたいです。

python

1from tensorflow.python.keras.layers import Conv2D, BatchNormalization, Add, Activation 2from keras_contrib.layers.normalization import InstanceNormalization 34def residual_block(input_ts): 5 """ResidualBlockの構築する関数""" 6 x = Conv2D( 7 128, (3, 3), strides=1, padding='same' 8 )(input_ts) 9 x = InstanceNormalization()(x) 10 x = Activation('relu')(x) 11 x = Conv2D(128, (3, 3), strides=1, padding='same')(x) 12 x = InstanceNormalization()(x) 13 return Add()([x, input_ts])

発生している問題・エラーメッセージ

このResidualBlockを作ろうとしているオートエンコーダで呼び出すとエラーが出ました。

作ろうとしているオートエンコーダは後述します。エラーメッセージは

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-61-3df21208a8c9> in <module>() 59 # 変換ネットワークの構築 60 model_gen = build_encoder_decoder( ---> 61 input_shape=input_shape 62 ) <ipython-input-61-3df21208a8c9> in build_encoder_decoder(input_shape) 15 16 x = Conv2D(32, (9, 9), strides=1, padding='same')(x) ---> 17 x = InstanceNormalization()(x) 18 x = Activation('relu')(x) 19 /usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in __call__(self, inputs, **kwargs) 604 605 # Handle mask propagation. --> 606 previous_mask = _collect_previous_mask(inputs) 607 user_kwargs = copy.copy(kwargs) 608 if not _is_all_none(previous_mask): /usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in _collect_previous_mask(input_tensors) 2843 inbound_layer, node_index, tensor_index = x._keras_history 2844 node = inbound_layer._inbound_nodes[node_index] -> 2845 mask = node.output_masks[tensor_index] 2846 masks.append(mask) 2847 else: AttributeError: 'Node' object has no attribute 'output_masks'

です。

該当のソースコード

上のresidual_block作成関数を、以下の
オートエンコーダ作成関数で呼び出しています。
関数定義のすぐ下でオートエンコーダの作成を呼び出しています。

python

1from tensorflow.python.keras.layers import Input, Lambda, Conv2DTranspose 2from tensorflow.python.keras.models import Model, Sequential 3 4 5def build_encoder_decoder(input_shape=(224, 224, 3)): 6 """変換用ネットワークの構築""" 7 8 # Encoder部分 9 input_ts = Input(shape=input_shape, name='input') 10 11 # 入力を[0, 1]の範囲に正規化 12 x = Lambda(lambda a: a/255.)(input_ts) 13 14 x = Conv2D(32, (9, 9), strides=1, padding='same')(x) 15 x = InstanceNormalization()(x) 16 x = Activation('relu')(x) 17 18 x = Conv2D(64, (3, 3), strides=2, padding='same')(x) 19 x = BatchNormalization()(x) 20 x = Activation('relu')(x) 21 22 x = Conv2D(128, (3, 3), strides=2, padding='same')(x) 23 x = BatchNormalization()(x) 24 x = Activation('relu')(x) 25 26 # ResidualBlockを5ブロック追加 27 for _ in range(5): 28 x = residual_block(x) 29 30 # Decoder部分 31 x = Conv2DTranspose( 32 64, (3, 3), strides=2, padding='same' 33 )(x) 34 x = BatchNormalization()(x) 35 x = Activation('relu')(x) 36 37 x = Conv2DTranspose(32, (3, 3), strides=2, padding='same')(x) 38 x = BatchNormalization()(x) 39 x = Activation('relu')(x) 40 41 x = Conv2DTranspose(3, (9, 9), strides=1, padding='same')(x) 42 x = BatchNormalization()(x) 43 x = Activation('tanh')(x) 44 45 # 出力値が[0, 255]になるようにスケール変換 46 gen_out = Lambda(lambda a: (a + 1)*127.5)(x) 47 48 model_gen = Model( 49 inputs=[input_ts], 50 outputs=[gen_out] 51 ) 52 53 return model_gen 54 55input_shape = (224, 224, 3) 56 57# 変換ネットワークの構築 58model_gen = build_encoder_decoder( 59 input_shape=input_shape 60)

試したこと

FunctionalAPI形式に対応していないかと思い、
Sequential()に.addしていく形で構成しても
今度は

The added layer must be an instance of class Layer

と.add(InstanceNormalization())しているところで
エラーが発生しました。

補足情報

Python3.6とKeras2で、
計算環境はGoogleColaboratoryです。
ローカルのCPUで計算(OSは仮想マシンのUbuntu)でも同様のエラーが出ました。

https://github.com/eriklindernoren/Keras-GAN/blob/master/ccgan/ccgan.py
にあるCCGANのコードは、InstanceNormalizationの呼び出しで
エラーが出ることはないようです。しかし、Sequentialに書いてもFunctionalに書いても、
こちらのコードでは上述の結果になってしまいます。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

これは原因が必ずしも解明できたわけではない、
その場しのぎかもしれない解決策なためdirty hack的ですが、

python

1from tensorflow.python.keras.hoge import poyo

としていたのを

python

1import keras 2from keras.hoge import poyo

とすることで正常に動作しました。

Kerasのバージョンが原因という話もGoogleで英語検索すると
出てくるようでしたが、直接パスがつながっているkerasからimportするのと
tensorflow.python.kerasからimportするのがどうして異なるのか、
なぜ前者ならバージョンの古さを解消できるかまではわかりませんでした。

あくまでdirty hackなため完全な自己解決にはまだしないでおきます。
結局正確な解決はできなかったので、これでいったん自己解決にします。

投稿2018/06/20 08:57

編集2018/07/17 06:29
abshaiaiouysu

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問