一、实现软件配置
1.keras2.2.0-tensorflow-GPU1.8
2.python3.6
3.spyder3.3.2
二、实现步骤
1.收集猫狗数据集按照 image/train/cat 和image/train/cat 文件夹的形式保存 test相同方法
2.下载载入预训练的VGG16模型,不包括全连接层
3.载入预训练的模型vgg16 重新搭建全连接层 将预训练模型与全连接层合并
4.使用ImageDataGenerator 和train_datagen.flow_from_directory函数对数据集进行处理
5.使用model.compile定义优化器和损失函数
6.使用model.fit_generator定义训练参数
7.使用model.save('model_vgg16.h5')保存模型
8.画图
三、实现代码
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 26 11:47:42 2020
@author: Administrator
"""
from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras.optimizers import SGD
import matplotlib.pyplot as plt
# 载入预训练的VGG16模型,不包括全连接层
vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(150,150,3))
# 搭建全连接层
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))
model = Sequential() #将vgg16与自定义全连接层合并
model.add(vgg16_model)
model.add(top_model)
#训练数据集 处理
train_datagen = ImageDataGenerator(
# rotation_range = 40, # 随机旋转角度
# width_shift_range = 0.2, # 随机水平平移
# height_shift_range = 0.2, # 随机竖直平移
rescale = 1./255, # 数值归一化
shear_range = 0.2, # 随机裁剪
zoom_range =0.2, # 随机放大
horizontal_flip = True, # 水平翻转
fill_mode='nearest') # 填充方式
#测试集处理
test_datagen = ImageDataGenerator(
rescale = 1./255 #数据归一化
)
batch_size = 32
#生成训练数据
train_generator = train_datagen.flow_from_directory(
'image/train',
# target_size = (150,150),
target_size = (200,200),
batch_size = batch_size,
)
#生成测试数据
test_generator = test_datagen.flow_from_directory(
'image/test',
# target_size = (150,150),
target_size = (200,200),
batch_size = batch_size,
)
#train_generator.class_indices
#定义优化器 代价函数 训练过程中计算准确率
model.compile(optimizer=SGD(lr=1e-4,momentum=0.9),loss='categorical_crossentropy',metrics=['accuracy'])
history = model.fit_generator(train_generator,steps_per_epoch=10,
epochs=20,
validation_data = test_generator, # validation_data为验证数据集
validation_steps = len(test_generator)
)
#保存模型和参数
#只保存模型参数用model.save_weight('路径') 载入模型参数 先导入load_weights模块 在使用model.load_weights(路径)
#保存网络结构的话from tensorflow.keras.model imort model_from_json json_string = model.to_json() 载入网络结构 model = model_from_json(json_string)
model.save('model_vgg16.h5')
#画出模型图
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)
plt.title('model accuracy') #标题
plt.ylabel('accuracy') #y轴名称
plt.xlabel('epoch') #x轴名称
plt.plot(epochs,acc,label='Train_acc') #以epochs为横坐标,以训练集准确性为纵坐标
plt.plot(epochs,val_acc,label='Val_acc') #以epochs为横坐标,以验证集准确性为纵坐标
plt.plot(epochs,loss,label='Train_loss')
plt.plot(epochs,val_loss,label='Val_loss')
plt.legend(loc='upper left') #绘制图例,即标明图中的线段代表何种含义
plt.savefig('loss-acc.png')
plt.show() #显示所有图表
四、训练结果
五、测试代码
from keras.models import load_model,Sequential
import numpy as np
from keras.preprocessing.image import load_img,img_to_array
label = np.array(['cat','dog'])
#载入模型
model = load_model('model_vgg16.h5')
#导入图片
path = 'temp/2.jpg'
image = load_img(path)
image = image.resize((150,150))
image = img_to_array(image)
image = image/255
image = np.expand_dims(image,0)
image.shape
#print(label[model.predict_class(image)])
predict = model.predict(image) #采用合并预测的方法
predict=np.argmax(predict,axis=1)
print(label[predict])