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



相关文章
|
11天前
|
机器学习/深度学习 存储 人工智能
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
【9月更文挑战第1天】AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
|
12天前
|
存储 人工智能 数据可视化
AI计算机视觉笔记二十一:PaddleOCR训练自定义数据集
在完成PaddleOCR环境搭建与测试后,本文档详细介绍如何训练自定义的车牌检测模型。首先,在`PaddleOCR`目录下创建`train_data`文件夹存放数据集,并下载并解压缩车牌数据集。接着,复制并修改配置文件`ch_det_mv3_db_v2.0.yml`以适应训练需求,包括设置模型存储目录、训练可视化选项及数据集路径。随后,下载预训练权重文件并放置于`pretrain_models`目录下,以便进行预测与训练。最后,通过指定命令行参数执行训练、断点续训、测试及导出推理模型等操作。
|
1天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
11 0
|
29天前
|
机器学习/深度学习 数据采集 TensorFlow
使用TensorFlow进行模型训练:一次实战探索
【8月更文挑战第22天】本文通过实战案例详解使用TensorFlow进行模型训练的过程。首先确保已安装TensorFlow,接着预处理数据,包括加载、增强及归一化。然后利用`tf.keras`构建卷积神经网络模型,并配置训练参数。最后通过回调机制训练模型,并对模型性能进行评估。此流程为机器学习项目提供了一个实用指南。
|
12天前
|
人工智能 数据处理 计算机视觉
AI计算机视觉笔记十六:yolov5训练自己的数据集
本文介绍了一种利用云服务器AutoDL训练疲劳驾驶行为检测模型的方法。由于使用本地CPU训练效率低下,作者选择了性价比高的AutoDL云服务器。首先,从网络获取了2000多张疲劳驾驶行为图片并使用labelimg软件进行标注。接着,详细介绍了在云服务器上创建实例、上传数据集和YOLOv5模型、修改配置文件以及开始训练的具体步骤。整个训练过程耗时约3小时,最终生成了可用于检测的模型文件。
|
20天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
43 0
|
20天前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
34 0
|
20天前
|
安全 Apache 数据安全/隐私保护
你的Wicket应用安全吗?揭秘在Apache Wicket中实现坚不可摧的安全认证策略
【8月更文挑战第31天】在当前的网络环境中,安全性是任何应用程序的关键考量。Apache Wicket 是一个强大的 Java Web 框架,提供了丰富的工具和组件,帮助开发者构建安全的 Web 应用程序。本文介绍了如何在 Wicket 中实现安全认证,
30 0
|
20天前
|
机器学习/深度学习 数据采集 TensorFlow
从零到精通:TensorFlow与卷积神经网络(CNN)助你成为图像识别高手的终极指南——深入浅出教你搭建首个猫狗分类器,附带实战代码与训练技巧揭秘
【8月更文挑战第31天】本文通过杂文形式介绍了如何利用 TensorFlow 和卷积神经网络(CNN)构建图像识别系统,详细演示了从数据准备、模型构建到训练与评估的全过程。通过具体示例代码,展示了使用 Keras API 训练猫狗分类器的步骤,旨在帮助读者掌握图像识别的核心技术。此外,还探讨了图像识别在物体检测、语义分割等领域的广泛应用前景。
9 0
|
30天前
|
机器学习/深度学习 人工智能 搜索推荐
【颠覆传统】解锁记忆新姿势:多模态AI单词助记神器——让单词学习变得生动有趣,打造个性化学习新体验!
【8月更文挑战第21天】多模态AI单词助记模型融合文本、语音与图像,增强英语单词记忆效果。设计上利用多感官刺激提升信息处理与记忆效率。技术栈包括React.js前端、Node.js后端、PyTorch深度学习框架等。实现过程涵盖数据准备、前端开发、后端服务搭建、深度学习模型构建及用户反馈循环。应用显示该模型显著提高学习兴趣与记忆效率,尤其对视觉和听觉学习者有益,个性化推荐系统进一步优化学习体验。
32 0

热门文章

最新文章