学习目标:

  1. 掌握使用预训练好的ResNet对自己的数据再次进行训练的方法。
  2. 掌握函数式建立Keras模型的方法。

学习内容:

  1. 利用ImageDataGenerator类直接从硬盘中读取猫和狗(cat-and-dog)数据,自定义合适的卷积神经网络进行分类。
  2. 对猫和狗(cat-and-dog)数据,在预训练好的ResNet上添加合适的网络层,构造网络进行训练。并调整网络参数,对比分析相应的结果。

学习过程:

1.用Adam优化器,学习率为0.0001,batch_size为16,统一resize图片的大小为128*128,进行10次迭代的结果如下:

用Adam优化器,学习率为0.0001,batch_size为16,统一resize图片的大小为256*256,进行15次迭代的结果如下:

最后测试集的识别率为0.7420。

优化器

学习率

批量大小

图片大小

迭代次数

识别率

Adam

0.0001

16

128*128

10

0.7830

Adam

0.0001

16

256*256

15

0.7420

图像放大后进行测试的效果反而没有没放大之前的好。

2.

模型各层的输出大小:

预训练好的ResNet上调整优化器为Adam,学习率为0.0001,batch_size为16,统一resize图片的大小为128*128,进行10次迭代的结果如下:

调整优化器为Adam,学习率为0.0001,batch_size为16,统一resize图片的大小为64*64,进行20次迭代的结果如下:

训练结果如下表:

优化器

学习率

批量大小

图片大小

迭代次数

识别率

Adam

0.0001

16

128*128

10

0.7123

Adam

0.0001

16

64*64

20

0.6653

图像缩小后进行测试的效果也没有图片像素为128*128的好。


源码:

第一问:

# In[0]:构造网络
from tensorflow.keras import Sequential,Input,layers,optimizers
model = Sequential( [Input(shape=(256,256,3)),  # 二维卷积操作的输入数据要求:[样本数,宽度,高度,通道数]layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), # 3x3的卷积核,输出32个通道layers.MaxPooling2D(pool_size=(2, 2)),                    # 取2x2网格的最大值进行下采样layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),  layers.MaxPooling2D(pool_size=(2, 2)),layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),layers.Flatten(),      # 把上一层得到的结果展平成一维向量(3*3*64=576)layers.Dropout(0.5),   # 训练时,每个batch随机选50%的权重固定不更新layers.Dense(64, activation="relu"),   layers.Dense(2, activation="softmax"),
])model.summary()# 自定义优化器
optimizer = optimizers.Adam(lr=0.0001)model.compile(optimizer,loss='categorical_crossentropy', metrics=['accuracy'])# In[1]: 加载数据
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen_train = ImageDataGenerator(rescale = 1. / 255 ,#rotation_range = 20, # width_shift_range = 0.2,#height_shift_range = 0.2 #shear_range = 0.2, #zoom_range = 0.2,#horizontal_flip = True,)# In[2]:从硬盘分批读取数据并测试
generator_train = datagen_train.flow_from_directory(r'D:\Cadabra_tools002\course_data\cat-and-dog\training_set',  # 训练集所在路径,子目录为类别target_size=(256, 256),           # 统一resize所有图片的大小为 (28,28)batch_size=16,                 # 输入到fit函数中的批的大小
)model.fit(generator_train,epochs=15)# In[3]:从硬盘分批读取数据并测试
datagen_validation = ImageDataGenerator(rescale = 1. / 255)
generator_validation = datagen_validation.flow_from_directory(r'D:\Cadabra_tools002\course_data\cat-and-dog\test_set',  target_size=(256, 256), #依次换成128*128和256*256                batch_size=16,
)# In[4]:测试
loss, accuracy = model.evaluate(generator_validation)

第二问:

#-------------------------------------------
# 用预训练好的ResNet50网络进行图像分类,并根据自己的数据微调网络权重
#-------------------------------------------
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.regularizers import l2
from tensorflow.keras import Sequential,optimizers
import numpy as np
#import cv2# In[1]: 加载数据
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen_train = ImageDataGenerator(rescale = 1. / 255 ,)# In[2]:从硬盘分批读取数据并测试
generator_train = datagen_train.flow_from_directory(r'D:\Cadabra_tools002\course_data\cat-and-dog\training_set',  # 训练集所在路径,子目录为类别target_size=(64, 64),           # 统一resize所有图片的大小为 (28,28)batch_size=16,                 # 输入到fit函数中的批的大小
)# In[2]: ResNet50模型,加载预训练权重
# 若没有模型文件,则自动下载(由于下载速度很慢,所以建议先把文件放进相应的目录)
# C:\Users\Administrator\.keras\models\resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5
base_model = ResNet50(input_shape=(64, 64, 3), include_top=False, weights='imagenet')
base_model.trainable=False
x = base_model.output
x = Flatten()(x)
x = Dense(512,activation='relu',kernel_regularizer=l2(0.0003))(x)
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)#自定义优化器
optimizer = optimizers.Adam(lr=0.0001)model.compile(optimizer, loss='categorical_crossentropy',metrics=['accuracy'])
model.summary() # 打印模型各层的输出大小# In[3]: 训练
# 更改迭代此处 epochs=50,才能获得比较高的识别率
model.fit(generator_train,epochs=20, batch_size=16,)
#model.save_weights('resnet_turn_cifar10.h5') # In[4]:测试
datagen_validation = ImageDataGenerator(rescale = 1. / 255)
generator_validation = datagen_validation.flow_from_directory(r'D:\Cadabra_tools002\course_data\cat-and-dog\test_set',  target_size=(64, 64), #依次换成128*128和64*64         batch_size=16,
)# In[5]:测试识别率
loss, accuracy = model.evaluate(generator_validation)
print('测试识别率为:', np.round(accuracy,4))

源码下载


学习产出:

1.跑起来有点费时,通过调整图像的大小,图像越大费时越多,最后只能往小了调整,但图片的像素小,最后测试的识别率不高。

人工智能--预训练的卷积神经网络相关推荐

  1. Python深度学习(使用预训练的卷积神经网络)--学习笔记(十一)

    5.3 使用预训练的卷积神经网络 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已经在大型数据 ...

  2. 从零开始学keras之使用预训练的卷积神经网络

    想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络. 预训练网络(pretrained network)是一个保存好的网络,之前已在大型数据集(通常是大规模图像分类任务)上训 ...

  3. 使用预训练的卷积神经网络

    想要将深度学习应用于小型图像数据集,使用预训练网络就是一种常用且高效的方法. 预训练网络就是一个保存好的网络,之前已在大型数据集上训练(通常是大规模图像分类任务). 如果训练的原始数据集足够大且足够通 ...

  4. 深度学习--使用预训练的卷积神经网络

    文章目录 前言 一.使用预训练网络 二.将VGG16卷积基实例化 三.使用卷积基进行特征提取 1.不使用数据增强的快速特征提取 2.使用数据增强的特征提取 四.微调模型 前言 想要将深度学习应用于小型 ...

  5. 使用预训练的卷积神经网络(猫狗图片分类)

    本次所用数据来自ImageNet,使用预训练好的数据来预测一个新的数据集:猫狗图片分类.这里,使用VGG模型,这个模型内置在Keras中,直接导入就可以了. from keras.applicatio ...

  6. 【深度学习】预训练的卷积模型比Transformer更好?

    引言 这篇文章就是当下很火的用预训练CNN刷爆Transformer的文章,LeCun对这篇文章做出了很有深意的评论:"Hmmm".本文在预训练微调范式下对基于卷积的Seq2Seq ...

  7. 卷积神经网络的训练过程,卷积神经网络如何训练

    深度神经网络是如何训练的? Coursera的Ng机器学习,UFLDL都看过.没记错的话Ng的机器学习里是直接给出公式了,虽然你可能知道如何求解,但是即使不知道完成作业也不是问题,只要照着公式写就行. ...

  8. TensorFlow2使用预训练的卷积网络(ConvNet)进行迁移学习

    本案例使用预训练的模型对猫狗数据集进行分类任务.使用预训练的模型有两种方式: 一是利用特征提取器.利用预训练模型的前几层对新数据进行特征提取,最后加入分类的层即可完成新模型的创建. 二是Fine Tu ...

  9. 卷积神经网络的训练算法,卷积神经网络算法实现

    卷积神经网络算法是什么? 一维构筑.二维构筑.全卷积构筑. 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feed ...

最新文章

  1. 使用FileItem获取文件名时注意事项
  2. 百练OJ:2728:第一个C++程序
  3. Spring bean - scope详解
  4. java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用
  5. linux实现shell,linux
  6. 计算机第二课堂教学计划,小学的第二课堂教学计划
  7. sql科学计数法转换为普通数字_Python3数据类型之数字-Python入门到精通
  8. 中国互联网大会首届智能网联论坛举行 数字技术驱动交通出行行业创新发展
  9. 大话西游之程序员做项目
  10. 论文降重,你都用了什么奇特的方法?
  11. Win10更新后BUG——任务栏点不动、卡死、加载不出来解决办法
  12. 微信小程序点击事件(bindtap)传递参数的方法
  13. tl-wdr5620千兆版设置虚拟服务器,TP-LINK无线路由TL-WDR5620千兆版使用步骤图解
  14. WSJ0中的wv文件如何转换为wav文件
  15. Photoshop CC 2018 安装包安装教程
  16. 基于matlab特征脸Eigenface算法的实现
  17. R语言快速运行脚本程序
  18. 程序员在网吧敲代码,这波操作真的太秀了!
  19. face to face
  20. 知道python程序设计基础期末答案_Python程序设计基础_知到答案章节作业期末答案...

热门文章

  1. 解决servlet请求转发、响应重定向无法实现页面跳转问题
  2. 基于智慧灯杆的行人检测与识别
  3. 计算机局域网组建与互建,实验4 局域网组建与网络互连认识实验指导
  4. 《厚黑学》| 读书三诀
  5. VC窗口刷新InvalidateRect和…
  6. 苹果变了:Mac 用自研芯片、iPhone 替代车钥匙
  7. CSDN PC端网站及其部分功能产品体验的一点分析
  8. I won't tell you this is about graph theory----zjfc bellman-ford算法与spfa算法
  9. 响铃:连续三季翻番,在收入问题上腾讯云如何体现发展质量优势?
  10. 手机有监控功能?分分钟查询手机使用记录!早点知道就好了!