Keras(二十二)使用keras实现resnet50模型做迁移学习-finetune

2023-11-07

本文将介绍:

  • 使用keras实现resnet50模型
  • 实现迁移学习-finetune

一,下载kaggle-10monkey数据

通过下面的链接,下载dataset到本地目录intput
kaggle-10monkey下载地址

二,使用keras中ImageDataGenerator读取数据、数据增强

1,使用keras中ImageDataGenerator读取数据、数据增强
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import sklearn
import sys
import tensorflow as tf
import time
from tensorflow import keras

# 打印使用的python库的版本信息
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
    print(module.__name__, module.__version__)
    
# 1,实现tensorflow动态按需分配GPU
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
    
# 常量的定义
train_dir = "./input/training/training"
valid_dir = "./input/validation/validation"
label_file = "./input/monkey_labels.txt"
print(os.path.exists(train_dir))
print(os.path.exists(valid_dir))
print(os.path.exists(label_file))

print(os.listdir(train_dir))
print(os.listdir(valid_dir))

# 查看打印出来的label值
labels = pd.read_csv(label_file, header=0)
print(labels)

# 定义常量
height = 224    # resne50的处理的图片大小
width = 224     # resne50的处理的图片大小
channels = 3
batch_size = 24 # 因为处理的图片变大,batch_size变小一点 32->24
num_classes = 10

# 一,使用keras中ImageDataGenerator读取数据
# 1,实例化ImageDataGenerator
# 对于图片数据,在keras里有更高层的封装.读取数据且做数据增强 -> Generator
train_datagen = keras.preprocessing.image.ImageDataGenerator(
    preprocessing_function = keras.applications.resnet50.preprocess_input,# 此函数是是现在keras中,而非tf.keras中,在tf中,实现数据做归一化,数据取值在-1~1之间.
    # rescale = 1./255,    # 由于preprocessing_function已做了归一化,此处注释; 图像中的每个像素点都是在0~255之间,得到一个0~1之间的数
    rotation_range = 40,    # 图片增强的方法,把图片随机旋转一个角度,旋转的角度就在-40~40之间
    width_shift_range = 0.2,    # 做水平位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    height_shift_range = 0.2,   # 做垂直位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    shear_range = 0.2,  # 剪切强度
    zoom_range = 0.2,   # 缩放强度
    horizontal_flip = True, # 是否随机做水平翻转
    fill_mode = 'nearest',  # 填充像素规则,用离其最近的像素点做填充
)
# 2,使用ImageDataGenerator读取图片
# 从训练集的文件夹中读取图片
train_generator = train_datagen.flow_from_directory(train_dir,# 图片的文件夹位置
                                                   target_size = (height, width),# 将图片缩放到的大小
                                                   batch_size = batch_size, # 多少张为一组
                                                   seed = 7,#随机数种子
                                                   shuffle = True,# 是否做混插
                                                   class_mode = "categorical")  # 控制目标值label的形式-选择onehot编码后的形式
# 从验证集的文件夹中读取图片
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,
                                                    seed = 7,
                                                    shuffle = False,
                                                    class_mode = "categorical")
2,查看训练家和验证集分别有多少张数据
train_num = train_generator.samples
valid_num = valid_generator.samples
print(train_num, valid_num)
3,如何从ImageDataGenerator中读取数据
for i in range(1):
    x, y = train_generator.next()
    print(x.shape, y.shape)
    print(y)

三,定义模型

1,定义ResNet50中50层初始化参数均不变
resnet50_fine_tune = keras.models.Sequential()
resnet50_fine_tune.add(keras.applications.ResNet50(include_top = False, # 网络结构的最后一层,resnet50有1000类,去掉最后一层
                                                   pooling = 'avg', #resnet50模型倒数第二层的输出是三维矩阵-卷积层的输出,做pooling或展平
                                                   weights = 'imagenet')) # 参数有两种imagenet和None,None为从头开始训练,imagenet为从网络下载已训练好的模型开始训练
resnet50_fine_tune.add(keras.layers.Dense(num_classes, activation = 'softmax')) # 因为include_top = False,所以需要自己定义最后一层
resnet50_fine_tune.layers[0].trainable = False # 因为参数是从imagenet初始化的,所以我们可以只调整最后一层的参数

resnet50_fine_tune.compile(loss="categorical_crossentropy",
                           optimizer="sgd", metrics=['accuracy']) #对于微调-finetune来说,优化器使用sgd来说更好一些 
resnet50_fine_tune.summary()
2,定义ResNet50中后5层初始化参数变化
plot_learning_curves(history, 'accuracy', epochs, 0, 1)
plot_learning_curves(history, 'loss', epochs, 0, 2)

# 
resnet50 = keras.applications.ResNet50(include_top = False,
                                       pooling = 'avg',
                                       weights = 'imagenet')
resnet50.summary()

# 
for layer in resnet50.layers[0:-5]:
    layer.trainable = False

resnet50_new = keras.models.Sequential([
    resnet50,
    keras.layers.Dense(num_classes, activation = 'softmax'),
])
resnet50_new.compile(loss="categorical_crossentropy",
                     optimizer="sgd", metrics=['accuracy'])
resnet50_new.summary()

四,训练模型

epochs = 10
# history = resnet50_fine_tune.fit_generator(train_generator,
history = resnet50_new.fit_generator(train_generator,
                                           steps_per_epoch = train_num // batch_size,
                                           epochs = epochs,
                                           validation_data = valid_generator,
                                           validation_steps = valid_num // batch_size)

五,打印模型训练曲线

def plot_learning_curves(history, label, epcohs, min_value, max_value):
    data = {}
    data[label] = history.history[label]
    data['val_'+label] = history.history['val_'+label]
    pd.DataFrame(data).plot(figsize=(8, 5))
    plt.grid(True)
    plt.axis([0, epochs, min_value, max_value])
    plt.show()
    
plot_learning_curves(history, 'accuracy', epochs, 0, 1)
plot_learning_curves(history, 'loss', epochs, 0, 2)

六,总结代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import sklearn
import sys
import tensorflow as tf
import time
from tensorflow import keras

# 打印使用的python库的版本信息
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
    print(module.__name__, module.__version__)
    
# 1,实现tensorflow动态按需分配GPU
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
    
# 常量的定义
train_dir = "./input/training/training"
valid_dir = "./input/validation/validation"
label_file = "./input/monkey_labels.txt"
print(os.path.exists(train_dir))
print(os.path.exists(valid_dir))
print(os.path.exists(label_file))

print(os.listdir(train_dir))
print(os.listdir(valid_dir))

# 查看打印出来的label值
labels = pd.read_csv(label_file, header=0)
print(labels)

# 定义常量
height = 224    # resne50的处理的图片大小
width = 224     # resne50的处理的图片大小
channels = 3
batch_size = 24 # 因为处理的图片变大,batch_size变小一点 32->24
num_classes = 10

# 一,使用keras中ImageDataGenerator读取数据
# 1,实例化ImageDataGenerator
# 对于图片数据,在keras里有更高层的封装.读取数据且做数据增强 -> Generator
train_datagen = keras.preprocessing.image.ImageDataGenerator(
    preprocessing_function = keras.applications.resnet50.preprocess_input,# 此函数是是现在keras中,而非tf.keras中,在tf中,实现数据做归一化,数据取值在-1~1之间.
    # rescale = 1./255,    # 由于preprocessing_function已做了归一化,此处注释; 图像中的每个像素点都是在0~255之间,得到一个0~1之间的数
    rotation_range = 40,    # 图片增强的方法,把图片随机旋转一个角度,旋转的角度就在-40~40之间
    width_shift_range = 0.2,    # 做水平位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    height_shift_range = 0.2,   # 做垂直位移 - 增加位移鲁棒性(如果0~1之间则位移比例随机选数做位移;如果大于1,则是具体的像素大小)
    shear_range = 0.2,  # 剪切强度
    zoom_range = 0.2,   # 缩放强度
    horizontal_flip = True, # 是否随机做水平翻转
    fill_mode = 'nearest',  # 填充像素规则,用离其最近的像素点做填充
)
# 2,使用ImageDataGenerator读取图片
# 从训练集的文件夹中读取图片
train_generator = train_datagen.flow_from_directory(train_dir,# 图片的文件夹位置
                                                   target_size = (height, width),# 将图片缩放到的大小
                                                   batch_size = batch_size, # 多少张为一组
                                                   seed = 7,#随机数种子
                                                   shuffle = True,# 是否做混插
                                                   class_mode = "categorical")  # 控制目标值label的形式-选择onehot编码后的形式
# 从验证集的文件夹中读取图片
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,
                                                    seed = 7,
                                                    shuffle = False,
                                                    class_mode = "categorical")
# 3,查看训练家和验证集分别有多少张数据
train_num = train_generator.samples
valid_num = valid_generator.samples
print(train_num, valid_num)

# 4,如何从ImageDataGenerator中读取数据
for i in range(2):
    x, y = train_generator.next()
    print(x.shape, y.shape)
    print(y)
    
    
# 二,构建模型
# 1,ResNet50中50层参数均不变
resnet50_fine_tune = keras.models.Sequential()
resnet50_fine_tune.add(keras.applications.ResNet50(include_top = False, # 网络结构的最后一层,resnet50有1000类,去掉最后一层
                                                   pooling = 'avg', #resnet50模型倒数第二层的输出是三维矩阵-卷积层的输出,做pooling或展平
                                                   weights = 'imagenet')) # 参数有两种imagenet和None,None为从头开始训练,imagenet为从网络下载已训练好的模型开始训练
resnet50_fine_tune.add(keras.layers.Dense(num_classes, activation = 'softmax')) # 因为include_top = False,所以需要自己定义最后一层
resnet50_fine_tune.layers[0].trainable = False # 因为参数是从imagenet初始化的,所以我们可以只调整最后一层的参数

resnet50_fine_tune.compile(loss="categorical_crossentropy",
                           optimizer="sgd", metrics=['accuracy']) #对于微调-finetune来说,优化器使用sgd来说更好一些 
resnet50_fine_tune.summary()

# 2,ResNet50中后5层参数均变化
resnet50 = keras.applications.ResNet50(include_top = False,
                                       pooling = 'avg',
                                       weights = 'imagenet')
resnet50.summary()

for layer in resnet50.layers[0:-5]:
    layer.trainable = False

resnet50_new = keras.models.Sequential([
    resnet50,
    keras.layers.Dense(num_classes, activation = 'softmax'),
])
resnet50_new.compile(loss="categorical_crossentropy",
                     optimizer="sgd", metrics=['accuracy'])
resnet50_new.summary()

# 三,训练模型(两种模型可选择训练)
epochs = 10
# history = resnet50_fine_tune.fit_generator(train_generator,
history = resnet50_new.fit_generator(train_generator,
                                           steps_per_epoch = train_num // batch_size,
                                           epochs = epochs,
                                           validation_data = valid_generator,
                                           validation_steps = valid_num // batch_size)

# 四,打印模型训练曲线
def plot_learning_curves(history, label, epcohs, min_value, max_value):
    data = {}
    data[label] = history.history[label]
    data['val_'+label] = history.history['val_'+label]
    pd.DataFrame(data).plot(figsize=(8, 5))
    plt.grid(True)
    plt.axis([0, epochs, min_value, max_value])
    plt.show()
    
plot_learning_curves(history, 'accuracy', epochs, 0, 1)
plot_learning_curves(history, 'loss', epochs, 0, 2)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras(二十二)使用keras实现resnet50模型做迁移学习-finetune 的相关文章

  • Keras:嵌入/向量的附加层?

    我有 3 个词嵌入 嵌入 1 w11 w12 w13 w14 嵌入 2 w21 w22 w23 w24 嵌入 3 w31 w32 w33 w34 有没有办法通过添加所有三个向量来获得第四个嵌入 并使用所有向量的可训练权重 例如 嵌入 4 w
  • 如何使用FeatureUnion转换PipeLine中的多个特征?

    我有一个 pandas 数据框 其中包含有关用户发送的消息的信息 对于我的模型 我感兴趣的是预测消息的缺失收件人 即给定消息的收件人 A B C 我想预测还有谁应该成为收件人的一部分 我正在使用 OneVsRestClassifier 和
  • TensorFlow 运算符重载

    有什么区别 tf add x y and x y 在 TensorFlow 中 当您使用以下命令构建图表时 您的计算图表会有什么不同 代替tf add 更一般地说 有 或者其他张量超载的操作 如果至少有一个x or y is a tf Te
  • Tensorflow“feed_dict”:对键值对使用相同的符号得到“TypeError:无法将 feed_dict 键解释为张量”

    我正在使用构建线性回归的 Tensorflow 示例 我的代码如下 import numpy as np import tensorflow as tf train X np asarray 3 3 4 4 5 5 6 71 6 93 4
  • 查找张量流运算所依赖的所有变量

    有没有办法找到给定操作 通常是损失 所依赖的所有变量 我想用它来将该集合传递到optimizer minimize or tf gradients 使用各种set intersection 组合 到目前为止我已经找到了op op input
  • 缩小轴 1 的形状为空 [x,0]

    我正在尝试训练 SVHN 街景门牌号码 数据集 用于张量流中的对象检测 对数字进行一些基本的 OCR 到目前为止 我已经成功地遵循了对象检测张量流指南中的宠物训练示例 当我基于样本 fast rcnn resnet101 config 训练
  • 使用 keras 澄清 Yolo v3 模型输出

    我将 yolo v3 模型与 keras 一起使用 该网络为我提供了形状如下的输出容器 1 13 13 255 1 26 26 255 1 52 52 255 所以我找到了这个link https www cyberailab com ho
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • model.predict() 返回类而不是概率

    Hello 我是第一次使用 Keras 我训练并保存了一个模型 作为 json 文件及其权重 该模型旨在将图像分为 3 个类别 我的编译方法 model compile loss categorical crossentropy optim
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究
  • tf-models:official.vision.detection Mask-RCNN 无效参数:indices[1,63] = [1, -1] 未索引到参数形状 [2,100,112,112]

    我正在尝试根据此处提供的官方 MaskRCNN 模型训练 Mask RCNN 模型 张量流 模型 https github com tensorflow models tree master official vision detectio
  • 计算机AI算法写句子?

    我正在寻找有关处理文本句子或在创建在正常人类语言 例如英语 中有效的句子时遵循结构的算法的信息 我想知道这个领域是否有我可以学习或开始使用的项目 例如 如果我给一个程序一个名词 为其提供同义词库 相关单词 和词性 以便它理解每个单词在句子中
  • TensorFlow:Dst 张量未初始化

    The MNIST For ML Beginners当我运行时教程给我一个错误print sess run accuracy feed dict x mnist test images y mnist test labels 其他一切都运行
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Keras conv1d 层参数:过滤器和 kernel_size

    我对 keras 的 conv1d 层中的这两个参数感到非常困惑 https keras io layers convolutional conv1d https keras io layers convolutional conv1d 文
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • Keras IndexError:索引超出范围

    我是 Keras 新手 我尝试在数据集上执行二进制 MLP 并且不断使索引超出范围 但不知道为什么 from keras models import Sequential from keras layers core import Dens
  • softmax_cross_entropy_with_logits 的 PyTorch 等效项

    我想知道 TensorFlow 是否有等效的 PyTorch 损失函数softmax cross entropy with logits TensorFlow 是否有等效的 PyTorch 损失函数softmax cross entropy
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有

随机推荐