DenseNet:グラフが切断されました:テンソルの値を取得できません

2020-02-14 python tensorflow keras

Densenetを構築しようとしていますが、次のエラーが発生しました。 再現する最小の例を次に示します。

import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim, name="Inputs")
    feature_list.append(input_x)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv1")(input_x)
    feature_list.append(x)

    x = tfkl.Concatenate(axis=-1, name="Concat1")(feature_list)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv2")(x)
    feature_list.append(x)
    x = tfkl.Concatenate(axis=-1, name="Concat2")(feature_list)

    return tf.keras.Model(inputs=input_x, outputs=x)

z = create_model((128,128,2))

私が得るエラー:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("Conv2/Identity:0", shape=(None, 128, 128, 16), dtype=float32) at layer "Concat1". The following previous layers were accessed without issue: ['Inputs', 'Conv1']

このモデルの何が問題なのか理解できませんでしたか?

ここでfeature_listを使用する背後にある考え方は、後から可変数の畳み込み層を持つ高密度ブロックを作成できるということです。

    for i in range(nb_layers):
          nb_filter += growth_rate
          x = tfkl.Concatenate(axis=-1)(feature_list)
          x = tfkl.Conv2D(nb_filter , kernel_size=(3, 3), padding="same")(x)
          feature_list.append(x)

さらに、create_model関数で次の2行をコメントアウトすると:

    #feature_list.append(x)
    #x = tfkl.Concatenate(axis=-1, name="Concat2")(feature_list)

その後、モデルは問題なく機能します(したがって、一般に連結が正しく機能することを意味します)

z.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
Inputs (InputLayer)             [(None, 128, 128, 2) 0                                            
__________________________________________________________________________________________________
Conv1 (Conv2D)                  (None, 128, 128, 16) 304         Inputs[0][0]                     
__________________________________________________________________________________________________
Concat1 (Concatenate)           (None, 128, 128, 18) 0           Inputs[0][0]                     
                                                                 Conv1[0][0]                      
__________________________________________________________________________________________________
Conv2 (Conv2D)                  (None, 128, 128, 16) 2608        Concat1[0][0]                    
==================================================================================================
Total params: 2,912
Trainable params: 2,912
Non-trainable params: 0
__________________________________________________________________________________________________

Answers

私はあなたのレイヤーの名前、同じレイヤー名で配列を連結しようとしているためだと思う:[input_x、x、x]、これを試してください:

import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim)
    feature_list.append(input_x)
    conv1 = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same")(input_x)
    feature_list.append(conv1)

    concat1 = tfkl.Concatenate(axis=-1)(feature_list)
    conv2 = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same")(concat1)
    feature_list.append(conv2)

    concat2 = tfkl.Concatenate(axis=-1)(feature_list)

    return tf.keras.Model(inputs=input_x, outputs=concat2)

z = create_model((128,128,2))

keras機能モデルの作成は熱心に実行されず、リストは単なる参照にすぎないと考えてください。そのため、Conv2出力を機能リストに追加すると、次の行にも反映されますx = tfkl.Concatenate(axis=-1, name="Concat1")(feature_list)実際にはConv2出力はありません。

行うべきことは、機能リストのコピーを使用してConcatレイヤーを呼び出すことです。以下の例を参照してください。

import copy
import tensorflow as tf
from tensorflow import keras
import tensorflow.keras.layers as tfkl

def create_model(input_dim):

    feature_list = list()
    input_x = tfkl.Input(shape=input_dim, name="Inputs")
    feature_list.append(input_x)
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv1")(input_x)
    feature_list.append(x)

    x = tfkl.Concatenate(axis=-1, name="Concat1")(copy.copy(feature_list))
    x = tfkl.Conv2D(16, kernel_size=(3, 3), padding="same", name="Conv2")(x)
    feature_list.append(x)
    print(feature_list)
    x = tfkl.Concatenate(axis=-1, name="Concat2")(copy.copy(feature_list))

    return tf.keras.Model(inputs=input_x, outputs=x)

z = create_model((128,128,2))

Related