Keras 当我加载vgg16_weights.h5时,如何使用vgg网络?

Keras 当我加载vgg16_weights.h5时,如何使用vgg网络?,keras,deep-learning,theano,face-recognition,vgg-net,Keras,Deep Learning,Theano,Face Recognition,Vgg Net,我使用keras的VGG-16网络。这是 我的问题是如何使用这个网络进行微调,我必须使用这个网络的图像大小224*224吗?当我使用这个网络时,我必须使用1000个类? 如果我不使用1000个类,就会导致错误 例外:层形状(4096L,10L)与重量形状(40961000)不兼容 请求帮助,谢谢 如果你想看的话,我贴了一个详细的答案。以下代码片段将帮助您确定最后一层的尺寸: 从keras.models导入顺序图 从keras.layers导入卷积2D、零填充2D、最大池2D 将keras.bac

我使用keras的VGG-16网络。这是

我的问题是如何使用这个网络进行微调,我必须使用这个网络的图像大小224*224吗?当我使用这个网络时,我必须使用1000个类? 如果我不使用1000个类,就会导致错误

例外:层形状(4096L,10L)与重量形状(40961000)不兼容


请求帮助,谢谢

如果你想看的话,我贴了一个详细的答案。以下代码片段将帮助您确定最后一层的尺寸:

从keras.models导入顺序图
从keras.layers导入卷积2D、零填充2D、最大池2D
将keras.backend作为K导入
img_宽度,img_高度=128,128
#以我们的输入为输入构建VGG16网络
第一层=零填充2D((1,1),输入形状=(3,img\u宽度,img\u高度))
模型=顺序()
添加模型(第一层)
添加(卷积2D(64,3,3,activation='relu',name='conv1_1'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(64,3,3,activation='relu',name='conv1_2'))
add(MaxPooling2D((2,2),跨步=(2,2)))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(128,3,3,activation='relu',name='conv2_1'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(128,3,3,activation='relu',name='conv2_2'))
add(MaxPooling2D((2,2),跨步=(2,2)))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(256,3,3,activation='relu',name='conv3_1'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(256,3,3,activation='relu',name='conv3_2'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(256,3,3,activation='relu',name='conv3_3'))
add(MaxPooling2D((2,2),跨步=(2,2)))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv4_1'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv4_2'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv4_3'))
add(MaxPooling2D((2,2),跨步=(2,2)))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv5_1'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv5_2'))
添加(ZeroPadding2D((1,1)))
添加(卷积2D(512,3,3,activation='relu',name='conv5_3'))
add(MaxPooling2D((2,2),跨步=(2,2)))
#获取每个“关键”层的符号输出(我们给了它们唯一的名称)。
layer_dict=dict([(layer.name,layer)用于model.layers中的层])
#装载重物
进口h5py
权重\路径='vgg16\权重.h5'
f=h5py.File(权重路径)
对于范围内的k(f.attrs['nb_layers']):
如果k>=len(模型层):
#我们不会查看保存文件中最后一个(完全连接的)层
打破
g=f['layer_{}'。格式(k)]
范围内p的权重=[g['param{}'。格式(p)](g.attrs['nb_params'])]
model.layers[k]。设置权重(权重)
f、 关闭()
打印('已加载模型')
#以下是您想要的:
图m=图()
图形添加输入(“我的输入”,输入形状=(3,img\u宽度,img\u高度))
图m.add\u节点(model,name='your\u model',input='my\u inp')
图m.add_节点(flatte(),name='flatte',input='your_model')
图形添加节点(密集(4096,activation='relu'),name='Dense1',input='Flatten')
图形添加节点(Dropout(0.5),name='Dropout1',input='Dense1')
图形添加节点(密集(4096,activation='relu'),name='Dense2',input='Dropout1')
图形添加节点(Dropout(0.5),name='Dropout2',input='Dense2')
图形添加节点(密集(10,activation='softmax'),name='Final',input='Dropout2')
图形添加输出(name='out1',input='Final')
sgd=sgd(lr=0.1,衰变=1e-6,动量=0.9,nesterov=True)
图形编译(优化器=sgd,损失={'out1':'categorical\u crossentropy'})
请注意,可以冻结特征提取层的训练,只微调最后完全连接的层。 从中,只需添加
trainable=False
即可冻结层的训练。 冷冻前:

。。。
添加(卷积2D(512,3,3,activation='relu',name='conv5_1',trainable=False))
...
可培训:

。。。
添加(卷积2D(512,3,3,activation='relu',name='conv5_1',trainable=True))
...

默认情况下,
trainable
True
,因此如果您不了解该功能,会发生一些事情…

非常感谢!!!在您的代码中,您的意思是我只需要编辑课程编号的最后一层?如果我设置的所有层trainable=False意味着h5文件中的默认权重无法更新?没错,而且就您的问题对网络进行训练会快得多。请注意,您可以使用第二个顺序模型而不是图形模型。感谢您的回复!!!我不熟悉使用keras,现在我使用了您的代码,遇到了一些问题,您能帮我吗?`文件“E:/DL/vgg-16.py”,第125行,在graph_m.fit中(train_数据,train_标签,nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)文件“D:\Anaconda2\lib\site packages\keras\models.py”,第1184行,fit X=[data[name]代表姓名,按自己的顺序输入]索引器:只有整数、切片(
)、省略号(
)、numpy.newaxis(
None
)和整数或布尔数组是有效的索引`当我使用您的代码时,我遇到了这个问题`文件“E:/DL/vgg-16.py',第125行,在图形拟合中(列数据,列标签,nb_历元=10,shuffle=True,verbose=1,验证‌​_split=0.2)文件“D:\Anaconda2\lib\site packages\keras\models.py”,第1184行,在fit X=[data[name]for name in self.input_order]索引器中:只有整数、切片(:)、省略号(…)、numpy.newaxis(None)和整数或布尔数组是有效的索引`你能告诉我如何解决它吗?谢谢