29- 迁移学习 (TensorFlow系列) (深度学习)
创始人
2024-05-28 23:51:10
0

知识要点

  • 迁移学习: 使用别人预训练模型参数时,要注意别人的预处理方式。

  • 常见的迁移学习方式:

    • 载入权重后训练所有参数.
    • 载入权重后只训练最后几层参数.
    • 载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层.
  • 训练数据是 10_monkeys 数据: 10种猴子的图片集
  • 图片显示: plt.imshow(mokey)
  • 读取图片: mokey = plt.imread('./50.jpg')

导入resnet 模型:

  • resnet50 = keras.applications.ResNet50(include_top=False, pooling='avg')      # 导入模型
  • model = keras.models.Sequential()      # 开始建模
  • model.add(resnet50)     # 添加resnet 网络
  • model.add(keras.layers.Dense(num_classes=10, activation = 'softmax'))     # 添加全连接层
  • model.layers[0].trainable = False     # 除了最后一个全连接层, 其余部分参数不变
  • 模型配置:
model.compile(loss = 'categorical_crossentropy',optimizer = 'adam',metrics = ['acc'])
  • valid_datagen = keras.preprocessing.image.ImageDataGenerator(preprocessing_function = keras.applications.resnet50.preprocess_input)    # 数据初始化处理
  • 指定后面几层参数变化:
# 切片指定, 不可调整的层数
for layer in resnet50.layers[0:-5]:layer.trainable = False


一 迁移学习

1.1 简介

使用迁移学习的优势:

  • 能够快速的训练出一个理想的结果
  • 当数据集较小时也能训练出理想的效果

注意:使用别人预训练模型参数时,要注意别人的预处理方式。

1.2 常见迁移方式

常见的迁移学习方式:

  • 载入权重后训练所有参数.
  • 载入权重后只训练最后几层参数.
  • 载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层.

二 代码实现

2.1 导包

from tensorflow import keras
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as pltcpu=tf.config.list_physical_devices("CPU")
tf.config.set_visible_devices(cpu)
print(tf.config.list_logical_devices())

2.2 迁移模型  (在迁移模型 后加一层)

resnet50 = keras.applications.ResNet50(include_top=False, pooling='avg')num_classes =10
model = keras.models.Sequential()
model.add(resnet50)
model.add(keras.layers.Dense(num_classes, activation = 'softmax'))
model.summary()

2.3 配置模型 (除最后一层外, 其余参数全部冻结)

# 把除最后一层的参数外, 全部冻结
model.layers[0].trainable = False
model.compile(loss = 'categorical_crossentropy',optimizer = 'adam',metrics = ['acc'])

2.4 导入数据

train_dir = '../day 48 resnet/training/training/'
valid_dir = '../day 48 resnet/validation/validation/'
  • 原始数据处理
train_datagen = keras.preprocessing.image.ImageDataGenerator(preprocessing_function = keras.applications.resnet50.preprocess_input,rotation_range = 40,width_shift_range = 0.2,height_shift_range = 0.2,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True,vertical_flip = True,fill_mode = 'nearest')height = 224
width = 224
channels = 3
batch_size = 32
num_classes = 10train_generator = train_datagen.flow_from_directory(train_dir,target_size= (height, width),batch_size = batch_size,shuffle= True,seed = 7,class_mode= 'categorical')valid_datagen = keras.preprocessing.image.ImageDataGenerator(preprocessing_function = keras.applications.resnet50.preprocess_input)valid_generator = valid_datagen.flow_from_directory(valid_dir,target_size= (height, width),batch_size= batch_size,shuffle= True,seed = 7,class_mode= 'categorical')
print(train_generator.samples)   # 1098
print(valid_generator.samples)   # 272

2.5 模型训练

# 使用迁移学习, 效果较差, 原始数据的处理方式不同
# 修改需处理方式继续执行, 效果较好
histroy = model.fit(train_generator,steps_per_epoch= train_generator.samples // batch_size,epochs = 10,validation_data = valid_generator,validation_steps= valid_generator.samples // batch_size)

 2.6 训练后面几层神经网络参数

resnet50 = keras.applications.ResNet50(include_top=False, pooling='avg', weights='imagenet')
# 切片指定, 不可调整的层数
for layer in resnet50.layers[0:-5]:layer.trainable = False# 添加输出层
resnet50_new = keras.models.Sequential([resnet50, keras.layers.Dense(10, activation = 'softmax')])
resnet50_new.compile(loss = 'categorical_crossentropy',optimizer = 'adam',metrics = ['acc'])
resnet50_new.summary()

histroy = resnet50_new.fit(train_generator,steps_per_epoch= train_generator.samples // batch_size,epochs = 10,validation_data = valid_generator,validation_steps= valid_generator.samples // batch_size)

三 图片处理查看

3.1 图片显示

# 预测数据
mokey = plt.imread('./n5020.jpg')
plt.imshow(mokey)    # mokey.shape  (600, 336, 3)

for i in range(2):x, y = train_generator.next()print(type(x), type(y))    #  print('***', x.shape, y.shape)  # *** (32, 224, 224, 3) (32, 10)

3.2 尺寸变换

# 主要是形状和尺寸不对
# 改变尺寸, 再改变形状reshape
from scipy import ndimage  # 专门处理图片
# 改变形状
# 224 = 367 * x  x = 224/367
# 224 = 550 * y  y = 224/550
zoom = (224/mokey.shape[0], 224/mokey.shape[1])
monkey_zoomed = ndimage.zoom(mokey, (224/mokey.shape[0], 224/mokey.shape[1], 1))
monkey_zoomed.shape   # (224, 224, 3)
monkey_1 = keras.applications.resnet50.preprocess_input(monkey_zoomed)
monkey_1.min()    # -123.68
monkey_1 = monkey_1.reshape(1, 224, 224, 3)
model.predict(monkey_1).argmax(axis = 1)  # array([5], dtype=int64)

3.3 resnet 图片处理方式

3.3.1 前景查看

mokey1 = mokey/127.5
plt.imshow(mokey1)

3.3.2 背景查看

mokey1 = mokey1 - 1
plt.imshow(mokey1)

mokey1

相关内容

热门资讯

光荣退休领导致辞 光荣退休领导致辞范文(通用5篇)  在学习、工作或生活中,要用到致辞的情况还是蛮多的,致辞是指在仪式...
大学迎新晚会主持词 大学迎新晚会主持词  迎新,全称迎接新春,又叫迎接新年。迎新是中国的传统节日形式。或者欢迎、迎接新来...
教师节校长简短致辞 教师节校长简短致辞(通用10篇)  在日常学习、工作抑或是生活中,大家或多或少都用到过致辞吧,在各种...
张国荣经典台词 关于张国荣经典台词  1、哭,我为了感动谁,笑,又为了碰着谁。  ——《路过蜻蜓》  2、虽然我很喜...
新郎婚礼简短致辞 新郎婚礼简短致辞(精选10篇)  在平平淡淡的学习、工作、生活中,大家都经常接触到致辞吧,致辞是指在...
美剧经典台词截图 美剧经典台词截图  在社会发展不断提速的今天,用到台词的地方越来越多,台词是一种特殊的文学语言,必须...
女朋友撒娇的经典台词 女朋友撒娇的经典台词  1、这种被朋友的情况让我很失落,因为我喜欢他。  2、“她就是躲着我我该怎么...
会主持词开场白 会主持词开场白  篇一  尊敬的各位领导、各位来宾  各位公司同仁:  大家下午好!  非常高兴和大...
中国人寿保险公司晨会主持词 中国人寿保险公司晨会主持词  主持词由主持人于节目进行过程中串联节目的串联词。以下是小编整理的中国人...
公司中秋晚会主持词 关于公司中秋晚会主持词  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在当今不断发展...
小学生职位竞选词 小学生职位竞选词  个人觉得竞选中队长,你已经很清楚中队长需要做的事情了,那么就从每一个任务来发展一...
在结婚典礼上的精彩幽默主持词 在结婚典礼上的精彩幽默主持词各位来宾:大家好!奉新郎新娘之命,我来主持今天的婚礼。为什么新郎新娘一定...
婚礼主持人搞笑台词 婚礼主持人搞笑台词  各位来宾:  大家好!奉新郎新娘之命,我来主持今天的婚礼,婚礼主持人搞笑台词。...
幼儿园运动会主持稿 幼儿园运动会主持稿  篇一:幼儿园运动会主持词  踏着春天的脚步,踩着春风的节拍,春天已经来到我们中...
小学庆元旦活动主持词 小学庆元旦活动主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在当今社会生活中,...
爵士舞蹈串词主持词   爵士舞即美国现代舞,是一种急促又富动感的节奏型舞蹈,是属于一种外放性的舞蹈,不像古典芭蕾舞或现代...
幼儿园元旦节目主持词   齐x:亲爱的爸爸妈妈  周x:亲爱的爷爷奶奶  王x:亲爱的老师  李x:亲爱的小朋友们  合:...
运动会运动员赞美词 运动会运动员赞美词1.赞运动员是我们的目标,是我们的信念,在清凉的初秋,在喧嚣的田径场上,。你们点燃...
黄梅戏晚会的主持词 黄梅戏晚会的主持词  戏迷欢庆四一八 黄梅又添新奇葩  ——喜迎418暨欢庆黄梅戏艺术团成立的晚会台...