前提・実現したいこと
keras_contribにあるInstanceNormalizationを
通常のBatchNormalizationの代わりに使って
ResidualBlockを作りたいです。
python
1from tensorflow.python.keras.layers import Conv2D, BatchNormalization, Add, Activation 2from keras_contrib.layers.normalization import InstanceNormalization 3 4def 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に書いても、
こちらのコードでは上述の結果になってしまいます。
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。