实战迁移学习VGG19、ResNet50、InceptionV3实践猫狗大战问题

更新时间:2023-06-23 22:18:28 阅读: 评论:0

实战迁移学习VGG19、ResNet50、InceptionV3实践猫狗⼤战
问题
⼀、实践流程
1、数据预处理
主要是对训练数据进⾏随机偏移、转动等变换图像处理,这样可以尽可能让训练数据多样化
另外处理数据⽅式采⽤分批⽆序读取的形式,避免了数据按⽬录排序训练
#数据准备
def DataGen(lf, dir_path, img_row, img_col, batch_size, is_train):
if is_train:
datagen = ImageDataGenerator(rescale=1./255,
zoom_range=0.25, rotation_range=15.,
channel_shift_range=25., width_shift_range=0.02, height_shift_range=0.02,
horizontal_flip=True, fill_mode='constant')
借口英文el:
datagen = ImageDataGenerator(rescale=1./255)
generator = datagen.flow_from_directory(
dir_path, target_size=(img_row, img_col),
batch_size=batch_size,
shuffle=is_train)
return generator
2、载⼊现有模型
这个部分是核⼼⼯作,⽬的是使⽤ImageNet训练出的权重来做我们的特征提取器,注意这⾥后⾯的分类层去掉
ba_model = InceptionV3(weights='imagenet', include_top=Fal, pooling=None,
input_shape=(img_rows, img_cols, color),
class=nb_class)
然后是冻结这些层,因为是训练好的
for layer in ba_model.layers:
⽽分类部分,需要我们根据现有需求来新定义的,这⾥可以根据实际情况⾃⼰进⾏调整,⽐如这样
x = ba_model.output
# 添加⾃⼰的全链接分类层
x = GlobalAveragePooling2D()(x)
x = Den(1024, activation='relu')(x)
predictions = Den(nb_class, activation='softmax')(x)
或者
过去式单词x = ba_model.output
#添加⾃⼰的全链接分类层
x = Flatten()(x)
predictions = Den(nb_class, activation='softmax')(x)
3、训练模型
这⾥我们⽤fit_generator函数,它可以避免了⼀次性加载⼤量的数据,并且⽣成器与模型将并⾏执⾏以提⾼效率。⽐如可以在CPU上进⾏实时的数据提升,同时在GPU上进⾏模型训练
history_ft = model.fit_generator(
train_generator,
steps_per_epoch=steps_per_epoch,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_steps)
⼆、猫狗⼤战数据集
训练数据540M,测试数据270M,⼤家可以去官⽹下载
/c/dogs-vs-cats-redux-kernels-edition/data
下载后把数据分成dog和cat两个⽬录来存放
三、训练
训练的时候会⾃动去下权值,⽐如vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5,但是如果我们已经下载好了的话,可以改源代码,让他直接读取我们的下载好的权值,⽐如在resnet50.py中
1、VGG19
vgg19的深度有26层,参数达到了549M,原模型最后有3个全连接层做分类器所以我还是加了⼀个1024的全连接层,训练10轮的情况达到了89%
2、ResNet50
ResNet50的深度达到了168层,但是参数只有99M,分类模型我就简单点,⼀层直接分类,训练10轮的达到了96%的准确率
3、inception_v3
InceptionV3的深度159层,参数92M,训练10轮的结果
等腰三角形有几条对称轴
这是⼀层直接分类的结果
这是加了⼀个512全连接的,⼤家可以随意调整测试
四、完整的代码
# -*- coding: utf-8 -*-
英语学习成人import os
from keras.utils import plot_model
会计上岗证培训
from snet50 import ResNet50
from keras.applications.vgg19 import VGG19
from keras.applications.inception_v3 import InceptionV3
from keras.layers import Den,Flatten,GlobalAveragePooling2D dels import Model,load_model
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt
class PowerTransferMode:
#数据准备
def DataGen(lf, dir_path, img_row, img_col, batch_size, is_train):        if is_train:
datagen = ImageDataGenerator(rescale=1./255,
上海留学机构zoom_range=0.25, rotation_range=15.,
channel_shift_range=25., width_shift_range=0.02, height_shift_range=0.02,
horizontal_flip=True, fill_mode='constant')
el:
datagen = ImageDataGenerator(rescale=1./255)
generator = datagen.flow_from_directory(
dir_path, target_size=(img_row, img_col),
batch_size=batch_size,
#class_mode='binary',
shuffle=is_train)
return generator
#ResNet模型
def ResNet50_model(lf, lr=0.005, decay=1e-6, momentum=0.9, nb_class=2, img_rows=197, img_cols=197, RGB=True, is_plot_model=Fal):        color = 3 if RGB el 1
ba_model = ResNet50(weights='imagenet', include_top=Fal, pooling=None, input_shape=(img_rows, img_cols, color),
class=nb_class)
#冻结ba_model所有层,这样就可以正确获得bottleneck特征
for layer in ba_model.layers:
x = ba_model.output
#添加⾃⼰的全链接分类层
x = Flatten()(x)
cured#x = GlobalAveragePooling2D()(x)
#x = Den(1024, activation='relu')(x)
predictions = Den(nb_class, activation='softmax')(x)
#训练模型
model = Model(inputs=ba_model.input, outputs=predictions)
sgd = SGD(lr=lr, decay=decay, momentum=momentum, nesterov=True)
娴熟pile(loss='categorical_crosntropy', optimizer=sgd, metrics=['accuracy'])
#绘制模型
if is_plot_model:
plot_model(model, to_file='resnet50_model.png',show_shapes=True)
return model全球最拥堵城市
#VGG模型
def VGG19_model(lf, lr=0.005, decay=1e-6, momentum=0.9, nb_class=2, img_rows=197, img_cols=197, RGB=True, is_plot_model=Fal):        color = 3 if RGB el 1
ba_model = VGG19(weights='imagenet', include_top=Fal, pooling=None, input_shape=(img_rows, img_cols, color),
class=nb_class)
#冻结ba_model所有层,这样就可以正确获得bottleneck特征
for layer in ba_model.layers:
height
x = ba_model.output
#添加⾃⼰的全链接分类层
x = GlobalAveragePooling2D()(x)
x = Den(1024, activation='relu')(x)
predictions = Den(nb_class, activation='softmax')(x)
#训练模型
model = Model(inputs=ba_model.input, outputs=predictions)
sgd = SGD(lr=lr, decay=decay, momentum=momentum, nesterov=True)

本文发布于:2023-06-23 22:18:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1024246.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   训练   分类   模型   避免   学习   下载
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图