赞
踩
是一个保存好的网络,之前已在大型数据集(通常是大规模图像分类任务)上训练好。通过预训练网络学到的特征在不同问题之间的可移植性,在深度学习对小数据问题非常有效。使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)。
在图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,最后是一个密集连接分类器。第一部分叫做模型的卷积基。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,在上面运行新的数据,然后在输出上面训练一个新的分类器。
- #将VGG16卷积基实例化
- from keras.applications import VGG16
- conv_base=VGG16(weights='imagenet',include_top=False,input_shape=(64,64,3))
这里向架构中传入了三个参数
1.weights:模型初始化的权重检查点。
2.include——top:是指定模型最后是否包含密集连接分类器。
3.input——shape:输入网络中图像的形状。
2.VGG16卷积基的详细架构
conv_base.summary()
结果如图所示:
最后输出的特征图形状为(2,2,512)。
1.构造卷积基特征提取
- #构造卷积基特征提取
- import os
- import numpy as np
- from keras.preprocessing.image import ImageDataGenerator
- def extract_features(directory,sample_count):
- features=np.zeros(shape=(sample_count,2,2,512))
- labels=np.zeros(shape=(sample_count))
- generator=datagen.flow_from_directory(
- directory,
- target_size=(64,64),
- batch_size=batch_size,
- class_mode='binary')
- i=0
- for inputs_batch,labels_batch in generator:
- features_batch=conv_base.predict(inputs_batch)
- features[i*batch_size:(i+1)*batch_size]=features_batch
- labels[i*batch_size:(i+1)*batch_size]=labels_batch
- i+=1
- if i*batch_size>=sample_count:
- break
- return features,labels
2.定义并训练密集连接器
- from keras import models
- from keras import layers
- from keras import optimizers
- model=models.Sequential()
- model.add(layers.Dense(128,activation='relu',input_dim=2*2*512))
- model.add(layers.Dropout(0.5))
- model.add(layers.Dense(1,activation='sigmoid'))
- model.compile(optimizer=optimizers.RMSprop(lr=2e-5),loss='binary_crossentropy',metrics=['acc'])
- history=model.fit(train_features,train_labels,epochs=100,batch_size=100,validation_data=(validation_features,validation_labels))
2.在顶部添加Dense层来扩展已有模型(即conv_base),并输入数据运行整个模型。这样我们还可以用数据增强。
1.在卷积基上添加一个密集链接分类器
- from keras import models
- from keras import layers
- model=models.Sequential()
- model.add(conv_base)
- model.add(layers.Flatten())
- model.add(layers.Dense(256,activation='relu'))
- model.add(layers.Dense(1,activation='sigmoid'))
2.模型架构如下所示:
VGG16的卷积基有14714688个参数,非常多。在编译和训练模型前,一定要‘冻结’卷积基。冻结
(freeze)一个或多个层是指在训练过程中保持其权重不变。如果不这样做,那么卷积基之前学到的表示将会发生改变。我们需要这样去冻结,代码如下:
- #冻结
- conv_base.trainable=False
3.利用冻结的卷积基端到端地训练模型增加了数据增强,代码如下:
- from keras.preprocessing.image import ImageDataGenerator
- from keras import optimizers
- train_datagen=ImageDataGenerator(
- rescale=1./255,
- rotation_range=40,
- width_shift_range=0.2,
- height_shift_range=0.2,
- shear_range=0.2,
- zoom_range=0.2,
- horizontal_flip=True,
- fill_mode='nearest'
- )
- test_datagen=ImageDataGenerator(rescale=1./225)
- train_generator=train_datagen.flow_from_directory(
- train_dir,
- target_size=(64,64),
- batch_size=80,
- class_mode='binary')
- validation_generator=test_datagen.flow_from_directory(
- validation_dir,
- target_size=(64,64),
- batch_size=50,
- class_mode='binary')
剩下模型编译和训练代码就不赘述了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。