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

相关内容

热门资讯

中考加油作文(实用6篇) 中考加油作文 篇一中考加油作文近日,我即将迎来人生中的重要一刻——中考。在这漫长的三年中,我付出了大...
就这样,埋下一颗种子中考作文... 就这样,埋下一颗种子中考作文篇一随着时间的推移,中考的脚步越来越近,我感受到了胸口的紧迫感。这次中考...
青春与爱同行中考范文(精选6... 青春与爱同行中考范文 篇一初中生活即将结束,我对这段时光充满了感慨和思考。回想起这三年来的点点滴滴,...
太阳作文(精选3篇) 太阳作文 篇一太阳,这是我们熟悉的天体之一。它是地球的中心,为我们提供了光和热,使我们能够生存。太阳...
中考大山(通用3篇) 中考大山 篇一大山,是我心中最美的地方。每当我想起中考时的那个夏天,总会想起我和同学们一起攀登大山的...
中考文言文必考篇目重点翻译句... 篇一:中考文言文必考篇目重点翻译句子文言文作为中考必考的一项内容,对学生的翻译能力要求较高。下面是几...
中考语文考试重点分析范文【精... 中考语文考试重点分析范文 篇一中考语文考试重点分析范文语文考试一直是中考中最重要的科目之一,它不仅考...
中考英语词语辨析:alive... 中考英语词语辨析:alive/ living/ the living/ 篇一标题:The Diffe...
中考热点作文【经典6篇】 中考热点作文 篇一题目:网络游戏对青少年的影响随着互联网的普及和技术的进步,网络游戏已经成为了许多青...
中考满分作文范文欣赏(精彩6... 中考满分作文范文欣赏 篇一梦想的力量人生如同一场马拉松,我们需要不断努力奔跑,才能到达胜利的终点。而...
中考作文写事满分范文(实用6... 中考作文写事满分范文 篇一我与“长者的故事”近日,我有幸参加了一次与老人们交流的活动,这让我对长者们...
你是我的太阳中考优秀作文【精... 你是我的太阳中考优秀作文 篇一太阳是地球上最重要的存在,它给予了我们光明与温暖。然而,在我心中,你是...
中考优秀作文满分范文大全【最... 中考优秀作文满分范文大全 篇一题目: 足球与我足球是一项广受欢迎的体育运动,也是我生活中不可或缺的一...
山西中考语文作文模板范文(推... 山西中考语文作文模板范文 篇一标题:传统与现代的碰撞随着社会的发展,传统文化与现代社会产生了许多碰撞...
“大爱”中考满分作文点评(精... “大爱”中考满分作文点评 篇一第一篇内容:探讨大爱的意义和体现方式在我们的日常生活中,大爱无处不在。...
中考辅导:语文知识复习(精彩... 中考辅导:语文知识复习 篇一语文知识复习对于中考来说是至关重要的。通过对重点知识的复习和巩固,可以提...
中考命题特点分析报告范文【优... 中考命题特点分析报告范文 篇一中考命题特点分析报告近年来,中考命题在内容和形式上都呈现出一些特点。本...
广西南宁中考作文题目专家点评... 广西南宁中考作文题目专家点评 篇一题目:如何提高中学生的阅读能力?中学生的阅读能力是一个重要的学习能...
考试后感想作文(精彩6篇) 考试后感想作文 篇一我对这次考试的感想这次考试结束了,我心情非常复杂。虽然我付出了很多努力,但结果并...
中考满分作文大全【优秀3篇】 中考满分作文大全 篇一健康饮食的重要性现代社会,随着生活水平的提高和生活节奏的加快,人们的饮食习惯也...