keras-vgg16识别猫狗


一、实现软件配置

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])

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容