keras逐层复制VGG16预训练重量

keras逐层复制VGG16预训练重量,keras,h5py,pre-trained-model,transfer-learning,vgg-net,Keras,H5py,Pre Trained Model,Transfer Learning,Vgg Net,我想将一些VGG16层权重逐层复制到另一个具有相似层的小型网络,但我得到一个错误,该错误表示: File "/home/d/Desktop/s/copyweights.py", line 78, in <module> list(f["model_weights"].keys()) File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper File "h5py/_objects.py

我想将一些VGG16层权重逐层复制到另一个具有相似层的小型网络,但我得到一个错误,该错误表示:

  File "/home/d/Desktop/s/copyweights.py", line 78, in <module>
    list(f["model_weights"].keys())
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "/usr/local/lib/python3.5/dist-packages/h5py/_hl/group.py", line 262, in __getitem__
    oid = h5o.open(self.id, self._e(name), lapl=self._lapl)
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
  File "h5py/h5o.pyx", line 190, in h5py.h5o.open
KeyError: "Unable to open object (object 'model_weights' doesn't exist)"
文件“/home/d/Desktop/s/copyweights.py”,第78行,在
列表(f[“模型权重”].keys())
文件“h5py/_objects.pyx”,第54行,在h5py._objects.with_phil.wrapper中
文件“h5py/_objects.pyx”,第55行,在h5py._objects.with_phil.wrapper中
文件“/usr/local/lib/python3.5/dist-packages/h5py/_-hl/group.py”,第262行,在__
oid=h5o.open(self.id,self.\u e(名称),lapl=self.\u lapl)
文件“h5py/_objects.pyx”,第54行,在h5py._objects.with_phil.wrapper中
文件“h5py/_objects.pyx”,第55行,在h5py._objects.with_phil.wrapper中
文件“h5py/h5o.pyx”,第190行,位于h5py.h5o.open中
KeyError:“无法打开对象(对象“模型权重”不存在)”
该文件肯定在路径中,我再次下载该文件只是为了确保它没有损坏(并且在使用model.load_weights时通常不会导致错误-我还安装了HDF5)

代码如下:

from keras import applications
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.models import Sequential, Model
from keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D
from keras import backend as k
from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping
from keras import layers
from keras import models
from keras import optimizers
from keras.layers import Dropout
from keras.regularizers import l2
from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator
import os

epochs = 50
callbacks = []
#schedule = None
decay = 0.0

earlyStopping = EarlyStopping(monitor='val_loss', patience=10, verbose=0, mode='min')
mcp_save = ModelCheckpoint('.mdl_wts.hdf5', save_best_only=True, monitor='val_loss', mode='min')
reduce_lr_loss = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1, epsilon=1e-5, mode='min')

base_model = models.Sequential()
base_model.add(layers.Conv2D(64, (3, 3), activation='relu', name='block1_conv1',  input_shape=(256, 256, 3)))
base_model.add(layers.Conv2D(64, (3, 3), activation='relu', name='block1_conv2'))
base_model.add(layers.MaxPooling2D((2, 2)))
#model.add(Dropout(0.2))
base_model.add(layers.Conv2D(128, (3, 3), activation='relu', name='block2_conv1'))
base_model.add(layers.Conv2D(128, (3, 3), activation='relu', name='block2_conv2'))
base_model.add(layers.MaxPooling2D((2, 2), name='block2_pool'))
#model.add(Dropout(0.2))

base_model.summary()
"""
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 256, 256, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 256, 256, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 256, 256, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 128, 128, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 128, 128, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 128, 128, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 64, 64, 128)       0         
=================================================================
Total params: 260,160.0
Trainable params: 260,160.0
Non-trainable params: 0.0
"""

layer_dict = dict([(layer.name, layer) for layer in base_model.layers])
[layer.name for layer in base_model.layers]
"""
['input_1',
 'block1_conv1',
 'block1_conv2',
 'block1_pool',
 'block2_conv1',
 'block2_conv2',
 'block2_pool']
"""

import h5py
weights_path = '/home/d/Desktop/s/vgg16_weights_new.h5' # ('https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels.h5)
f = h5py.File(weights_path)

list(f["model_weights"].keys())
"""
['block1_conv1',
 'block1_conv2',
 'block1_pool',
 'block2_conv1',
 'block2_conv2',
 'block2_pool',
 'block3_conv1',
 'block3_conv2',
 'block3_conv3',
 'block3_conv4',
 'block3_pool',
 'block4_conv1',
 'block4_conv2',
 'block4_conv3',
 'block4_conv4',
 'block4_pool',
 'block5_conv1',
 'block5_conv2',
 'block5_conv3',
 'block5_conv4',
 'block5_pool',
 'dense_1',
 'dense_2',
 'dense_3',
 'dropout_1',
 'global_average_pooling2d_1',
 'input_1']
"""

# list all the layer names which are in the model.
layer_names = [layer.name for layer in base_model.layers]


"""
# Here we are extracting model_weights for each and every layer from the .h5 file
>>> f["model_weights"]["block1_conv1"].attrs["weight_names"]
array([b'block1_conv1/kernel:0', b'block1_conv1/bias:0'], 
      dtype='|S21')
# we are assiging this array to weight_names below 
>>> f["model_weights"]["block1_conv1"]["block1_conv1/kernel:0]
<HDF5 dataset "kernel:0": shape (3, 3, 3, 64), type "<f4">
# The list comprehension (weights) stores these two weights and bias of both the layers 
>>>layer_names.index("block1_conv1")
1
>>> model.layers[1].set_weights(weights)
# This will set the weights for that particular layer.
With a for loop we can set_weights for the entire network.
"""
for i in layer_dict.keys():
    weight_names = f["model_weights"][i].attrs["weight_names"]
    weights = [f["model_weights"][i][j] for j in weight_names]
    index = layer_names.index(i)
    base_model.layers[index].set_weights(weights)

base_model.add(layers.Flatten())
base_model.add(layers.Dropout(0.5))  #Dropout for regularization
base_model.add(layers.Dense(256, activation='relu'))
base_model.add(layers.Dense(1, activation='sigmoid'))  #Sigmoid function at the end because we have just two classes


# compile the model with a SGD/momentum optimizer
# and a very slow learning rate.
base_model.compile(loss='binary_crossentropy',
                   optimizer=optimizers.Adam(lr=1e-4, decay=decay),
                   metrics=['accuracy'])



os.environ["CUDA_VISIBLE_DEVICES"]="0"

train_dir = '/home/d/Desktop/s/data/train'
eval_dir = '/home/d/Desktop/s/data/eval'
test_dir = '/home/d/Desktop/s/data/test'


# create a data generator
train_datagen = ImageDataGenerator(rescale=1./255,   #Scale the image between 0 and 1
                                    rotation_range=40,
                                    width_shift_range=0.2,
                                    height_shift_range=0.2,
                                    shear_range=0.2,
                                    zoom_range=0.2,
                                    horizontal_flip=True,)

val_datagen = ImageDataGenerator(rescale=1./255)  #We do not augment validation data. we only perform rescale

test_datagen = ImageDataGenerator(rescale=1./255)  #We do not augment validation data. we only perform rescale

# load and iterate training dataset
train_generator = train_datagen.flow_from_directory(train_dir,  target_size=(224,224),class_mode='binary', batch_size=16, shuffle='True', seed=42)
# load and iterate validation dataset
val_generator = val_datagen.flow_from_directory(eval_dir,  target_size=(224,224),class_mode='binary', batch_size=16, shuffle='True', seed=42)
# load and iterate test dataset
test_generator = test_datagen.flow_from_directory(test_dir,  target_size=(224,224), class_mode=None, batch_size=1, shuffle='False', seed=42)

#The training part
#We train for 64 epochs with about 100 steps per epoch
history = base_model.fit_generator(train_generator,
                              steps_per_epoch=train_generator.n // train_generator.batch_size,
                              epochs=epochs,
                              validation_data=val_generator,
                              validation_steps=val_generator.n // val_generator.batch_size,
                              callbacks=[earlyStopping, mcp_save, reduce_lr_loss])

#Save the model
#base_model.save_weights('/home/d/Desktop/s/base_model_weights.h5')
#base_model.save('/home/d/Desktop/s/base_model_keras.h5')

#lets plot the train and val curve
#get the details form the history object
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)

#Train and validation accuracy
plt.plot(epochs, acc, 'b', label='Training accuracy')
plt.plot(epochs, val_acc, 'r', label='Validation accuracy')
plt.title('Training and Validation accurarcy')
plt.legend()

plt.figure()
#Train and validation loss
plt.plot(epochs, loss, 'b', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()

plt.show()
来自keras导入应用程序的

从keras.preprocessing.image导入ImageDataGenerator
来自keras导入优化器
从keras.models导入顺序、模型
从keras.layers导入辍学、平坦、密集、全局平均池2D
从keras导入后端为k
从keras.callbacks导入modelscheckpoint、LearningRateScheduler、TensorBoard、earlystoping
从keras导入图层
从keras导入模型
来自keras导入优化器
从keras.layers导入退出
从keras.regularizers导入l2
从keras.callbacks导入Earlystoping、ModelCheckpoint和ReducelRon
将matplotlib.pyplot作为plt导入
从keras.preprocessing.image导入ImageDataGenerator
导入操作系统
纪元=50
回调=[]
#附表=无
衰减=0.0
EarlyStating=EarlyStating(监视器='val_loss',耐心=10,详细=0,模式='min')
mcp\u save=ModelCheckpoint('.mdl\u wts.hdf5',save\u best\u only=True,monitor='val\u loss',mode='min')
减少损失=减少稳定期(监测=评估损失',系数=0.1,耐心=3,冗长=1,ε=1e-5,模式=分钟')
base_model=models.Sequential()
base_model.add(layers.Conv2D(64,(3,3),activation='relu',name='block1_conv1',input_shape=(256,256,3)))
base_model.add(layers.Conv2D(64,(3,3),activation='relu',name='block1_conv2'))
base_model.add(layers.MaxPooling2D((2,2)))
#模型。添加(辍学(0.2))
base_model.add(layers.Conv2D(128,(3,3),activation='relu',name='block2_conv1'))
base_model.add(layers.Conv2D(128,(3,3),activation='relu',name='block2_conv2'))
base_model.add(layers.MaxPooling2D((2,2),name='block2_pool'))
#模型。添加(辍学(0.2))
base_model.summary()
"""
_________________________________________________________________
层(类型)输出形状参数
=================================================================
输入_1(输入层)(无、256、256、3)0
_________________________________________________________________
区块1_conv1(Conv2D)(无、256、256、64)1792
_________________________________________________________________
区块1_conv2(Conv2D)(无、256、256、64)36928
_________________________________________________________________
block1_池(MaxPoolig2D)(无、128、128、64)0
_________________________________________________________________
区块2_conv1(Conv2D)(无、128、128、128)73856
_________________________________________________________________
区块2_conv2(Conv2D)(无、128、128、128)147584
_________________________________________________________________
block2_池(MaxPoolig2D)(无、64、64、128)0
=================================================================
总参数:260160.0
可培训参数:260160.0
不可训练参数:0.0
"""
layer\u dict=dict([(layer.name,layer)表示基本\u模型中的层。layers])
[基本\模型.层中的层的layer.name]
"""
['input_1',
“区块1_conv1”,
“区块1_conv2”,
“区块1_池”,
“区块2_conv1”,
“block2_conv2”,
“区块2_池”]
"""
进口h5py
权重_path='/home/d/Desktop/s/vgg16_权重_new.h5'#('https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels.h5)
f=h5py.File(权重路径)
列表(f[“模型权重”].keys())
"""
['block1_conv1',
“区块1_conv2”,
“区块1_池”,
“区块2_conv1”,
“block2_conv2”,
“区块2_池”,
“区块3_conv1”,
“区块3_conv2”,
“区块3_conv3”,
“区块3_conv4”,
"三号楼泳池",,
“区块4_conv1”,
“区块4_conv2”,
“区块4_conv3”,
“区块4_conv4”,
"四号楼泳池",,
“区块5_conv1”,
“区块5_conv2”,
“区块5_conv3”,
“区块5_conv4”,
"五号楼泳池",,
“稠密_1”,
“稠密_2”,
“稠密_3”,
“辍学1”,
“全球平均池2D_1”,
“输入_1”]
"""
#列出模型中的所有图层名称。
layer_names=[基本_模型中的layer.name层]
"""
#这里我们从.h5文件中提取每个层的模型_权重
>>>f[“模型权重”][“块1权重1”]。属性[“权重名称”]
数组([b'block1_conv1/内核:0',b'block1_conv1/偏差:0'],
数据类型=“| S21”)
#我们正在将此数组分配给下面的\u名称的权重
>>>f[“模型权重”][“块1\u conv1”][“块1\u conv1/内核:0]
#列表理解(权重)存储这两个层的权重和偏差
>>>图层名称索引(“块1\u conv1”)
1.
>>>model.layers[1]。设置权重(权重)
#这将设置该特定层的权重。
使用for循环,我们可以为整个网络设置_权重。
"""
对于层中的i_dict.keys():
权重名称=f[“模型权重”][i].attrs[“权重名称”]
权重=[f[“模型权重”][i][j]表示权重名称中的j]
索引=图层名称。索引(i)
基本模型。图层[索引]。设置权重(权重)
基本模型。添加(layers.flatte())
基本模型。添加(层。退出(0.5))#退出用于正则化
base_model.add(layers.Dense(256,activation='relu'))
base_model.add(
from keras.applications import VGG16
vgg = VGG16(choose parameters)

for layer in vgg.layers:
    layer_weights_list = layer.get_weights()