一、實(shí)現(xiàn)軟件配置
1.keras2.2.0-tensorflow-GPU1.8
2.python3.6
3.spyder3.3.2
二、實(shí)現(xiàn)步驟
1.收集貓狗數(shù)據(jù)集按照? ?image/train/cat 和image/train/cat 文件夾的形式保存 test相同方法
2.下載載入預(yù)訓(xùn)練的VGG16模型,不包括全連接層
3.載入預(yù)訓(xùn)練的模型vgg16? ?重新搭建全連接層 將預(yù)訓(xùn)練模型與全連接層合并
4.使用ImageDataGenerator 和train_datagen.flow_from_directory函數(shù)對(duì)數(shù)據(jù)集進(jìn)行處理
5.使用model.compile定義優(yōu)化器和損失函數(shù)??
6.使用model.fit_generator定義訓(xùn)練參數(shù)
7.使用model.save('model_vgg16.h5')保存模型
8.畫圖
三、實(shí)現(xiàn)代碼
# -*- 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
# 載入預(yù)訓(xùn)練的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)
#訓(xùn)練數(shù)據(jù)集 處理
train_datagen = ImageDataGenerator(
#? ? ? ? rotation_range = 40,? ? ? # 隨機(jī)旋轉(zhuǎn)角度
#? ? ? ? width_shift_range = 0.2,? # 隨機(jī)水平平移
#? ? ? ? height_shift_range = 0.2, # 隨機(jī)豎直平移
? ? ? ? rescale = 1./255,? ? ? ? # 數(shù)值歸一化
? ? ? ? shear_range = 0.2,? ? ? ? # 隨機(jī)裁剪
? ? ? ? zoom_range? =0.2,? ? ? ? # 隨機(jī)放大
? ? ? ? horizontal_flip = True,? # 水平翻轉(zhuǎn)
? ? ? ? fill_mode='nearest')? ? ? # 填充方式
#測(cè)試集處理
test_datagen = ImageDataGenerator(
? ? ? ? rescale = 1./255? ? ? ? ? #數(shù)據(jù)歸一化
? ? ? ? )
batch_size = 32
#生成訓(xùn)練數(shù)據(jù)
train_generator = train_datagen.flow_from_directory(
? ? ? ? 'image/train',
#? ? ? ? target_size = (150,150),
? ? ? ? target_size = (200,200),
? ? ? ? batch_size = batch_size,
? ? ? ? )
#生成測(cè)試數(shù)據(jù)
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
#定義優(yōu)化器 代價(jià)函數(shù) 訓(xùn)練過程中計(jì)算準(zhǔn)確率
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為驗(yàn)證數(shù)據(jù)集
? ? ? ? ? ? ? ? ? ? validation_steps = len(test_generator)
? ? ? ? ? ? ? ? ? ? )
#保存模型和參數(shù)? ?
#只保存模型參數(shù)用model.save_weight('路徑')? 載入模型參數(shù) 先導(dǎo)入load_weights模塊 在使用model.load_weights(路徑)
#保存網(wǎng)絡(luò)結(jié)構(gòu)的話from tensorflow.keras.model imort model_from_json? json_string = model.to_json()? 載入網(wǎng)絡(luò)結(jié)構(gòu)? model = model_from_json(json_string)
model.save('model_vgg16.h5')
#畫出模型圖
acc = history.history['acc']? ? ? ? ? ? #獲取訓(xùn)練集準(zhǔn)確性數(shù)據(jù)
val_acc = history.history['val_acc']? ? #獲取驗(yàn)證集準(zhǔn)確性數(shù)據(jù)
loss = history.history['loss']? ? ? ? ? #獲取訓(xùn)練集錯(cuò)誤值數(shù)據(jù)
val_loss = history.history['val_loss']? #獲取驗(yàn)證集錯(cuò)誤值數(shù)據(jù)
epochs = range(1,len(acc)+1)
plt.title('model accuracy')? ? ? ? ? ? #標(biāo)題
plt.ylabel('accuracy')? ? ? ? ? ? ? ? ? #y軸名稱
plt.xlabel('epoch')? ? ? ? ? ? ? ? ? ? #x軸名稱
plt.plot(epochs,acc,label='Train_acc')? ? #以epochs為橫坐標(biāo),以訓(xùn)練集準(zhǔn)確性為縱坐標(biāo)
plt.plot(epochs,val_acc,label='Val_acc') #以epochs為橫坐標(biāo),以驗(yàn)證集準(zhǔn)確性為縱坐標(biāo)
plt.plot(epochs,loss,label='Train_loss')
plt.plot(epochs,val_loss,label='Val_loss')
plt.legend(loc='upper left')? #繪制圖例辰企,即標(biāo)明圖中的線段代表何種含義
plt.savefig('loss-acc.png')
plt.show()? ? #顯示所有圖表
四、訓(xùn)練結(jié)果
五蚯斯、測(cè)試代碼
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')
#導(dǎo)入圖片
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)? ? ? ? ? ? ? #采用合并預(yù)測(cè)的方法
predict=np.argmax(predict,axis=1)
print(label[predict])