1. ホーム
  2. ディープラーニング

keras AttributeError: 'NoneType' オブジェクトに属性 '_inbound_nodes' がない。

2022-02-22 07:18:56
<パス

エラーの原因とヒント

kerasを使ってモデルを構築する際に、TensorFlowをインターリーブして構築する必要があったのですが、kerasはfunctionalでもsequentialでも、各層の出力型はlayer typeなので、keras以外の関数を使うと、得られる変数型はlayer typeではないので、以下のエラーが報告されるようです。

File ". \lib\site-packages\keras\engine\network.py", line 1325, in build_map
node = layer._inbound_nodes[node_index]
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'


ソリューション

解決策は、カスタムレイヤーの出力をkerasのレイヤータイプに変更することで、実装はkerasのLambda関数を呼び出すだけとシンプルです。

ここでは、それを解決するための簡単な例を紹介します。

方法1

from tensorflow import squeeze
from keras.layers import Lambda

def squeeze_dim(input):
    output = squeeze(input, axis = [1,2])

def my_model(inputs):
    x = Conv2d(inputs)
    ...
    
    # Just use Lambda to call the predefined functions
    x = Lambda(squeeze_dim, name='sqe_dim')(x)
    
    model = Model(input = inputs, output = x)
    ...

from tensorflow import squeeze
from keras.layers import Lambda

def my_model(inputs):
    x = Conv2d(inputs)
    ...
    
    # Wrap the function directly in Lambda
    x = Lambda(lambda x: squeeze(x, axis = [1,2]) )
    
    model = Model(input = inputs, output = x)
    ...


方法2

from tensorflow import squeeze
from keras.layers import Lambda

def my_model(inputs):
    x = Conv2d(inputs)
    ...
    
    # Wrap the function directly in Lambda
    x = Lambda(lambda x: squeeze(x, axis = [1,2]) )
    
    model = Model(input = inputs, output = x)
    ...


終了