AI实战 | Tensorflow自定义数据集和迁移学习(附代码下载)

简介: AI实战 | Tensorflow自定义数据集和迁移学习(附代码下载)

自定义数据集


做深度学习项目时,我们一般都不用网上公开的数据集,而是用自己制作的数据集。那么,怎么用Tensorflow2.0来制作自己的数据集并把数据喂给神经网络呢?且看这篇文章慢慢道来。

Pokemon Datasets


这篇文章我们用的datasets是Pokemon datasets,也就是皮卡丘电影中的一些角色,如下图所示:

ec319a1d60ae94e1449a4bda0a0607b5.png

数据集下载


链接: https://pan.baidu.com/s/1V_ZJ7ufjUUFZwD2NHSNMFw

提取码:dsxl

数据集划分


image.png

由上图可知,60%的数据集用来train,20%的数据集用来validation,同样20%用来test

四个步骤


  • Load data:加载数据
  • Build model:建立模型
  • Train-Val-Test:训练和测试
  • Transfer Learning:迁移模型

加载数据


981d4663dcbce14f273858bb71f349fc.png

首先对数据进行预处理,把像素值的Numpy类型转换为Tensor类型,并归一化到[0~1]。把数据集的标签做one-hot编码。

def preprocess(x,y):
    # x: 图片的路径,y:图片的数字编码
    x = tf.io.read_file(x)
    x = tf.image.decode_jpeg(x, channels=3) # RGBA
    x = tf.image.resize(x, [244, 244])
    return x, y

数据集标准处理流程


代码中load_pokemon用的是自己的数据集写的代码,具体可阅读pokemon.py文件。

# 创建训练集Datset对象
images, labels, table = load_pokemon('pokemon',mode='train')
db_train = tf.data.Dataset.from_tensor_slices((images, labels))
db_train = db_train.shuffle(1000).map(preprocess).batch(batchsz)
# 创建验证集Datset对象
images2, labels2, table = load_pokemon('pokemon',mode='val')
db_val = tf.data.Dataset.from_tensor_slices((images2, labels2))
db_val = db_val.map(preprocess).batch(batchsz)
# 创建测试集Datset对象
images3, labels3, table = load_pokemon('pokemon',mode='test')
db_test = tf.data.Dataset.from_tensor_slices((images3, labels3))
db_test = db_test.map(preprocess).batch(batchsz)

图片数据增强及标准化


7f55cb46a4356637adc42b67e20071e0.png

一般数据集较少的话需要使用数据增强以增加数据集,防止训练网络过拟合。比如旋转角度、裁剪等,并归一化到[0~1]。把数据集的标签做one-hot编码。所示代码如下:

# x = tf.image.random_flip_left_right(x)
    x = tf.image.random_flip_up_down(x)
    x = tf.image.random_crop(x, [224,224,3])
    # x: [0,255]=> -1~1
    x = tf.cast(x, dtype=tf.float32) / 255.
    x = normalize(x)
    y = tf.convert_to_tensor(y)
    y = tf.one_hot(y, depth=5)

建立网络


e18319e4e3c66f3cd114dd9389c16dc4.png

神经网络从零开始训练,backbone用李沐大神的resnet网络。详细代码请查看resnet.py文件。部分代码如下:

class ResNet(keras.Model):
    def __init__(self, num_classes, initial_filters=16, **kwargs):
        super(ResNet, self).__init__(**kwargs)
        self.stem = layers.Conv2D(initial_filters, 3, strides=3, padding='valid')
        self.blocks = keras.models.Sequential([
            ResnetBlock(initial_filters * 2, strides=3),
            ResnetBlock(initial_filters * 2, strides=1),
            # layers.Dropout(rate=0.5),
            ResnetBlock(initial_filters * 4, strides=3),
            ResnetBlock(initial_filters * 4, strides=1),
            ResnetBlock(initial_filters * 8, strides=2),
            ResnetBlock(initial_filters * 8, strides=1),
            ResnetBlock(initial_filters * 16, strides=2),
            ResnetBlock(initial_filters * 16, strides=1),
        ])
        self.final_bn = layers.BatchNormalization()
        self.avg_pool = layers.GlobalMaxPool2D()
        self.fc = layers.Dense(num_classes)
    def call(self, inputs, training=None):
        # print('x:',inputs.shape)
        out = self.stem(inputs,training=training)
        out = tf.nn.relu(out)
        # print('stem:',out.shape)
        out = self.blocks(out, training=training)
        # print('res:',out.shape)
        out = self.final_bn(out, training=training)
        # out = tf.nn.relu(out)
        out = self.avg_pool(out)
        # print('avg_pool:',out.shape)
        out = self.fc(out)
        # print('out:',out.shape)
        return out

训练和测试


9143e2f8bf5e3c1300eca217a58bf971.png

部分代码如下:

resnet = keras.Sequential([
    layers.Conv2D(16,5,3),
    layers.MaxPool2D(3,3),
    layers.ReLU(),
    layers.Conv2D(64,5,3),
    layers.MaxPool2D(2,2),
    layers.ReLU(),
    layers.Flatten(),
    layers.Dense(64),
    layers.ReLU(),
    layers.Dense(5)
])
resnet = ResNet(5)
resnet.build(input_shape=(4, 224, 224, 3))
resnet.summary()
early_stopping = EarlyStopping(
    monitor='val_accuracy',
    min_delta=0.001,
    patience=5
)
resnet.compile(optimizer=optimizers.Adam(lr=1e-3),
               loss=losses.CategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])
resnet.fit(db_train, validation_data=db_val, validation_freq=1, epochs=100,
           callbacks=[early_stopping])
resnet.evaluate(db_test)

迁移网络学习


网络可以丛零开始训练,也可以从别的训练好的参数模型迁移过来,本次实战用Tensorflow预训练的vgg19模型来加载训练,从而加快训练过程。

迁移学习的原理如下图所示:

158e6a21e2674d9c17fd8eb5230b4784.png

4f42abe715993c8479f9bd37da0d7c8a.png

4f42abe715993c8479f9bd37da0d7c8a.png

部分代码如下:

net = keras.applications.VGG19(weights='imagenet', include_top=False,
                               pooling='max')
net.trainable = False
newnet = keras.Sequential([
    net,
    layers.Dense(5)
])
newnet.build(input_shape=(4,224,224,3))
newnet.summary()
early_stopping = EarlyStopping(
    monitor='val_accuracy',
    min_delta=0.001,
    patience=5
)
newnet.compile(optimizer=optimizers.Adam(lr=1e-3),
               loss=losses.CategoricalCrossentropy(from_logits=True),
               metrics=['accuracy'])
newnet.fit(db_train, validation_data=db_val, validation_freq=1, epochs=100,
           callbacks=[early_stopping])
newnet.evaluate(db_test)

代码下载


本篇文章完整代码在公众号对话框回复 “pokemon” 就可得到百度云链接,建议直接复制再去公众号回复。

参考资料


本篇文章主要参考网易云课堂龙龙老师的《深度学习与TensorFlow 2入门实战》

课程链接:https://study.163.com/course/courseMain.htm?courseId=1209092816&share=1&shareId=1026182418



相关文章
|
16小时前
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:AI在持续学习系统中的创新应用
【5月更文挑战第11天】 随着人工智能(AI)技术的飞速发展,其在教育领域的应用日益增多。特别是在持续学习系统(Lifelong Learning Systems, LLS)中,AI技术正开启着个性化和适应性教学的新篇章。本文聚焦于AI在LLS中的创新应用,探讨了机器学习、自然语言处理和认知建模等关键技术如何共同作用于构建智能化的学习环境。文章旨在分析当前AI技术在持续学习领域的最新进展,并展望其对未来教育模式的影响。
|
16小时前
|
机器学习/深度学习 TensorFlow 算法框架/工具
关于Tensorflow!目标检测预训练模型的迁移学习
这篇文章主要介绍了使用Tensorflow进行目标检测的迁移学习过程。关于使用Tensorflow进行目标检测模型训练的实战教程,涵盖了从数据准备到模型应用的全过程,特别适合对此领域感兴趣的开发者参考。
16 3
关于Tensorflow!目标检测预训练模型的迁移学习
|
16小时前
|
机器学习/深度学习 人工智能 自动驾驶
构建未来:AI在持续学习系统中的创新应用
【5月更文挑战第11天】 在人工智能的迅猛发展浪潮中,一个不断进化的分支便是AI在持续学习系统中的应用。本文旨在探讨AI技术如何革新持续学习系统,并分析其在不同领域的创新实践。文章首先界定了持续学习系统的概念,随后深入解析了深度学习、强化学习以及转移学习等关键技术在其中的作用。通过案例分析,展示了这些技术如何在医疗诊断、自动驾驶及个性化教育中发挥至关重要的角色。最终,讨论了面临的挑战与未来的发展趋势,为读者提供了一个关于AI在持续学习领域未来可能展开的蓝图。
6 1
|
16小时前
|
人工智能 vr&ar
[译][AI Research] AI 模型中的“it”是数据集
模型效果的好坏,最重要的是数据集,而不是架构,超参数,优化器。
|
16小时前
|
机器学习/深度学习 存储 人工智能
构建未来:AI在持续学习系统中的进化之路
【5月更文挑战第8天】 随着人工智能(AI)技术的飞速发展,AI系统正逐步从单一任务处理转向多任务、持续学习的智能体。本文将深入探讨AI技术在持续学习系统中的最新进展,包括深度学习、强化学习以及转移学习等关键技术。文章还将讨论如何通过这些技术实现AI系统的适应性、泛化能力和自我进化,从而推动AI在多变环境中的长期应用和自主决策能力。
|
16小时前
|
存储 人工智能 API
[译][AI OpenAI-doc] 迁移指南 Beta
我们已经改变了助手 API 在 beta 的 v1 版本和 v2 版本之间工具和文件的工作方式。今天,通过 API,两个 beta 版本仍然可以访问,但我们建议尽快迁移到我们 API 的最新版本。我们将在 2024 年底之前废弃 beta 的 v1 版本。
[译][AI OpenAI-doc] 迁移指南 Beta
|
16小时前
|
机器学习/深度学习 存储 人工智能
构建未来:AI在持续学习系统中的应用
【5月更文挑战第6天】 随着人工智能技术的飞速发展,AI在各个领域中的应用越来越广泛。本文将探讨AI在持续学习系统中的应用,以及如何通过这种技术提高教育质量和效率。我们将讨论AI如何帮助个性化学习,提供实时反馈,以及如何通过数据分析预测学生的学习进度。此外,我们还将探讨AI在教育中的潜在挑战和解决方案。
19 3
|
16小时前
|
人工智能 文字识别 语音技术
学习资料大全​ | 一起来魔搭社区学AI吧!
魔搭社区特别推出研习社栏目,包含AI前沿技术解读、模型应用最佳实践、动手做AI应用(AIGC/Agent/RAG)等主题,持续更新,代码实战点击即运行
|
16小时前
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch 与 Tensorflow:深度学习的主要区别(1)
Pytorch 与 Tensorflow:深度学习的主要区别(1)
15 2
|
16小时前
|
机器学习/深度学习 人工智能 自然语言处理
使用TensorFlow进行深度学习入门
【5月更文挑战第11天】本文引导读者入门TensorFlow深度学习,介绍TensorFlow——Google的开源机器学习框架,用于处理各种机器学习问题。内容包括TensorFlow安装(使用pip)、核心概念(张量、计算图和会话)以及构建和训练简单线性回归模型的示例。通过这个例子,读者可掌握TensorFlow的基本操作,包括定义模型、损失函数、优化器以及运行会话。

热门文章

最新文章