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

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

ただいまの
回答率

90.45%

  • Python 3.x

    10334questions

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

  • TensorFlow

    961questions

  • Keras

    513questions

InstanceNormalization層を実行しようとするとエラーが出る

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 64

前提・実現したいこと

KerasでInstanceNorm層とConvolution層を用いたEncoderを実装したいと思っています

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

エラーメッセージ
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-6a921f9b3839> in <module>
     27     )(x)
     28 
---> 29 model = build_encoder()

<ipython-input-3-6a921f9b3839> in build_encoder(input_shape)
     18         activation='relu'
     19     )(Input_layer)
---> 20     x = InstanceNormalization()(x)
     21     x = Conv2D(
     22         128,

~/.pyenv/versions/anaconda3-4.4.0/envs/ml/lib/python3.6/site-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    441 
    442             # Handle mask propagation.
--> 443             previous_mask = _collect_previous_mask(inputs)
    444             user_kwargs = copy.copy(kwargs)
    445             if not is_all_none(previous_mask):

~/.pyenv/versions/anaconda3-4.4.0/envs/ml/lib/python3.6/site-packages/keras/engine/base_layer.py in _collect_previous_mask(input_tensors)
   1309             inbound_layer, node_index, tensor_index = x._keras_history
   1310             node = inbound_layer._inbound_nodes[node_index]
-> 1311             mask = node.output_masks[tensor_index]
   1312             masks.append(mask)
   1313         else:

AttributeError: 'Node' object has no attribute 'output_masks'

該当のソースコード

import numpy as np
from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.models import Sequential, Model
from tensorflow.python.keras.layers import Conv2D, Activation, Input
from keras_contrib.layers.normalization.instancenormalization import InstanceNormalization

def build_encoder(input_shape=(256,256,3)): 
    Input_layer = Input(
        shape=input_shape,
        name='input'
    )
    x = Conv2D(
        64,
        3,
        1,
        padding='same',
        activation='relu'
    )(Input_layer)
    x = InstanceNormalization()(x)
    x = Conv2D(
        128,
        3,
        2,
        padding='same',
        activation='relu'
    )(x)

model = build_encoder()

試したこと

試しにソースコード20行目のInstanceNormalization()(x)をInstanceNormalization(x)にしてみると、以下のエラーコードが出ました

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-1930bd708f2a> in <module>
     27     )(x)
     28 
---> 29 model = build_encoder()

<ipython-input-2-1930bd708f2a> in build_encoder(input_shape)
     25         padding='same',
     26         activation='relu'
---> 27     )(x)
     28 
     29 model = build_encoder()

~/.pyenv/versions/anaconda3-4.4.0/envs/ml/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
    728 
    729         # Check input assumptions set before layer building, e.g. input rank.
--> 730         self._assert_input_compatibility(inputs)
    731         if input_list and self._dtype is None:
    732           try:

~/.pyenv/versions/anaconda3-4.4.0/envs/ml/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer.py in _assert_input_compatibility(self, inputs)
   1461           spec.min_ndim is not None or
   1462           spec.max_ndim is not None):
-> 1463         if x.shape.ndims is None:
   1464           raise ValueError('Input ' + str(input_index) + ' of layer ' +
   1465                            self.name + ' is incompatible with the layer: '

AttributeError: 'InstanceNormalization' object has no attribute 'shape'


またソースコード21-27行目のConv2Dを削除して実行、すなわちInstanceNormalization層以下に何も層を設置しない状態で実行すると、エラーコードは出ませんでした。

補足情報(FW/ツールのバージョンなど)

動作環境は、Jupiter Notebookです

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

参考記事いわく、以下のようにimport文を書き換えるとうまくいくようです。

import numpy as np
import keras
from keras import backend as K
from keras.models import Sequential, Model
from keras.layers import Conv2D, Activation, Input
from keras_contrib.layers.normalization.instancenormalization import InstanceNormalization

参考記事:KerasのInstanceNormalizationがエラー


ただし、この書き方にするとConv2Dの部分で以下のようなエラーが発生します。

ValueError                                Traceback (most recent call last)
<ipython-input-15-541578a2748e> in <module>()
     26     )(x)
     27 
---> 28 model = build_encoder()

2 frames
<ipython-input-15-541578a2748e> in build_encoder(input_shape)
     23         2,
     24         padding='same',
---> 25         activation='relu'
     26     )(x)
     27 

/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     32                 object_name = func.__name__
     33             if preprocessor:
---> 34                 args, kwargs, converted = preprocessor(args, kwargs)
     35             else:
     36                 converted = []

/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py in conv2d_args_preprocessor(args, kwargs)
    277                 if kwd in kwargs:
    278                     raise ValueError(
--> 279                         'It seems that you are using the Keras 2 '
    280                         'and you are passing both `kernel_size` and `strides` '
    281                         'as integer positional arguments. For safety reasons, '

ValueError: It seems that you are using the Keras 2 and you are passing both `kernel_size` and `strides` as integer positional arguments. For safety reasons, this is disallowed. Pass `strides` as a keyword argument instead.

これに関しては、kernel_sizestridesの両方を引数に持ってきているのが原因であり、stridesのみ書けば解消されます。

エラーメッセージでもstridesのみ引数にすることを推奨しているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/12 16:16

    ご回答のとうりに記述したところ無事動作しました、ありがとうございます。

    にしても、どうしてこれでうまくいくのか、よくわかりませんね…

    キャンセル

  • 2019/06/13 08:15

    tensorflow.python.keras(tensorflow付属のkeras)とkerasでは使っているファイルが違うので、それによる影響かもしれませんね。バージョンが同じでも起こるので、pathの話とか絡んだ難しい話になるかもしれませんが…

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10334questions

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

  • TensorFlow

    961questions

  • Keras

    513questions