我尝试使用自定义主干输入进行迁移学习:
(由于我的输入形状为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.
我的代码有什么问题?
答案 0 :(得分:0)
全局平均池化2D是对张量或多维数组执行操作的层。因此,传递像DenseNet这样的模型体系结构会引发错误,因为模型不知道它在看什么。模型架构文件与张量完全不同。
要实现我认为您要实现的目标,请运行DenseNet,然后将DenseNet的输出传递到正在创建的模型中,而不是传递模型本身。祝你好运!