ValueError:层conv2d_41的输入不是符号张量。该层的所有输入都应为张量

时间:2019-08-26 22:06:47

标签: keras keras-layer transfer-learning

我尝试使用自定义主干输入进行迁移学习:

(由于我的输入形状为N * N * 8,所以我无法正常转移学习,因此我需要添加小型network_1才能达到N * N * 3)

model_1 
   |
   |
add model_2
   |
add some layer

我的代码:

model_1.add(model_2)

model_1是我的小型网络: model_2是Mobilenet或VGG16或Densenet .....

model_1 = Sequential()
model_1.add(InputLayer(input_shape=(size, size, F), name="InputLayer"))
model_1.add(Convolution2D(3, 128, padding = 'same'))

from keras.applications.densenet import DenseNet169
model_2=DenseNet169(weights='imagenet',include_top=False)

model_2.layers.pop(0) # remove input_layer of model_2 
model_1.add(model_2) # output model_1 is input model_2?

model_1 = GlobalAveragePooling2D()(model_1)
model_1 = Dropout(0.2)(model_1)
model_1 = Dense(256*256, activation='softmax')(model_1)
model_1 = Reshape(256, 256)(model_1)

我遇到了错误:

ValueError: Layer global_average_pooling2d_3 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.engine.sequential.Sequential'>. Full input: [<keras.engine.sequential.Sequential object at 0x7f74f6621d68>]. All inputs to the layer should be tensors.

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

全局平均池化2D是对张量或多维数组执行操作的层。因此,传递像DenseNet这样的模型体系结构会引发错误,因为模型不知道它在看什么。模型架构文件与张量完全不同。

要实现我认为您要实现的目标,请运行DenseNet,然后将DenseNet的输出传递到正在创建的模型中,而不是传递模型本身。祝你好运!