我正在尝试建立一个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函数中注释掉以下两行:
#feature_list.append(x)
#x = tfkl.Concatenate(axis=-1, name="Concat2")(feature_list)
然后该模型可以正常工作(因此,通常意味着Concatenate可以正常工作):
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
__________________________________________________________________________________________________
答案 0 :(得分:1)
认为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))
答案 1 :(得分:0)
我认为这是由于您的图层名称所致,您试图连接具有相同图层名称的数组:[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))