keras - 合并相同的 vgg16 模型但具有不同的输入
问题描述
我正在研究一个项目中的分类问题。我的问题的特殊性是我必须使用两种不同类型的数据来管理它。我的课程是汽车、行人、卡车和骑自行车的人。我的数据集由以下组成:
我已经设法通过使用 keras API 的 Concatenate 函数来使用这两种模式来执行分类任务。
但我想做的是使用更强大的CNN,比如VGG。我使用预训练模型并冻结除最后 4 层以外的所有层。我将灰度图像读取为 RGB,因为 VGG16 预训练模型需要 3 个通道输入。这是我的代码:
from keras.applications import VGG16
#Load the VGG model
#Camera Model
vgg_conv_C = VGG16(weights='imagenet', include_top=False, input_shape=(227, 227, 3))
#Depth Model
vgg_conv_D = VGG16(weights='imagenet', include_top=False, input_shape= (227, 227, 3))
for layer in vgg_conv_D.layers[:-4]:
layer.trainable = False
for layer in vgg_conv_C.layers[:-4]:
layer.trainable = False
mergedModel = Concatenate()([vgg_conv_C.output,vgg_conv_D.output])
mergedModel = Dense(units = 1024)(mergedModel)
mergedModel = BatchNormalization()(mergedModel)
mergedModel = Activation('relu')(mergedModel)
mergedModel = Dropout(0.5)(mergedModel)
mergedModel = Dense(units = 4,activation = 'softmax')(mergedModel)
fused_model = Model([vgg_conv_C.input, vgg_conv_D.input], mergedModel) )
最后一行给出以下错误:
ValueError: The name "block1_conv1" is used 2 times in the model. All
layer names should be unique.
有人知道如何处理吗?简单来说,我只想在两种类型的图像上使用 VGG16,然后只获取每种模态的特征向量,然后将它们连接起来并在顶部添加完全连接的层来预测图像的类别。它适用于未经预训练的模型。如果需要可以提供代码
解决方案
尝试这个
#Camera Model
vgg_conv_C = VGG16(weights='imagenet', include_top=False, input_shape=(227, 227, 3))
for layer in vgg_conv_C.layers:
layer.name = layer.name + str('_C')
#Depth Model
vgg_conv_D = VGG16(weights='imagenet', include_top=False, input_shape= (227, 227, 3))
for layer in vgg_conv_D.layers:
layer.name = layer.name + str('_D')
这样,您仍然可以使用两个相同的预训练网络。
推荐阅读
- reactjs - Jest + React 可加载错误 不支持
- spring - 如何在春季进行单元测试验证注释
- php - 即使在重新安装服务器后,Wordpress 上的空白页
- python-3.x - 用python求解具有n个未知数的n个方程组
- python - asyncio/aiohttp 不返回响应
- arduino - ArduinoJson DynamicJsonDocument
- python - 如何遍历numpy数组的一个轴,返回内部数组而不是值
- arrays - Laravel 5 合并两个多维数组
- javascript - 如何使用 JavaScript 在 CRM 部分添加创建的元素?
- javascript - 检查字符串中是否包含单词列表