TensorFlow 2.0 - tf.data.Dataset 数据预处理 猫狗分类

文章目录

    • 1 tf.data.Dataset.from_tensor_slices() 数据集建立
    • 2. Dataset.map(f) 数据集预处理
    • 3. Dataset.prefetch() 并行处理
    • 4. for 循环获取数据
    • 5. 例子: 猫狗分类

学习于:简单粗暴 TensorFlow 2

1 tf.data.Dataset.from_tensor_slices() 数据集建立

tf.data.Dataset.from_tensor_slices()

import matplotlib.pyplot as plt
(train_data, train_label), (_, _) = tf.keras.datasets.mnist.load_data()
train_data = np.expand_dims(train_data.astype(np.float32)/255., axis=-1)mnistdata = tf.data.Dataset.from_tensor_slices((train_data, train_label))for img, label in mnistdata:plt.title(label.numpy())plt.imshow(img.numpy())plt.show()

2. Dataset.map(f) 数据集预处理

  • Dataset.map(f) 应用变换
def rotate90(img, label):img = tf.image.rot90(img)return img, labelmnistdata = mnistdata.map(rotate90)

在这里插入图片描述

  • Dataset.batch(batch_size) 分批
mnistdata = mnistdata.batch(5)for img, label in mnistdata:  # img [5,28,28,1],label [5] 包含 5个样本 fig, axs = plt.subplots(1, 5)  # 1 行 5列for i in range(5):axs[i].set_title(label.numpy()[i])axs[i].imshow(img.numpy()[i, :, :, :])plt.show()

  • Dataset.shuffle(buffer_size) 随机打乱
    buffer_size = 1,没有打乱的效果
    数据集较随机,buffer_size 可小一些,否则,设置大一些
    我在做猫狗分类例子的时候,遇到内存不足的报错,建议可以提前打乱数据
# 每次得到的数字不太一样
mnistdata = mnistdata.shuffle(buffer_size=100).batch(5)

3. Dataset.prefetch() 并行处理

  • Dataset.prefetch() 开启预加载数据,使得在 GPU 训练的同时 CPU 可以准备数据
mnistdata = mnistdata.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
# 可设置自动寻找 合适的 buffer_size
  • num_parallel_calls 多核心并行处理
mnistdata = mnistdata.map(map_func=rotate90,num_parallel_calls=2)
# 也可以自动找参数 tf.data.experimental.AUTOTUNE

4. for 循环获取数据

# for 循环
dataset = tf.data.Dataset.from_tensor_slices((A, B, C, ...))
for a, b, c, ... in dataset:# 对张量a, b, c等进行操作,例如送入模型进行训练# 或者 创建迭代器,使用 next() 获取
dataset = tf.data.Dataset.from_tensor_slices((A, B, C, ...))
it = iter(dataset)
a_0, b_0, c_0, ... = next(it)
a_1, b_1, c_1, ... = next(it)

5. 例子: 猫狗分类

项目及数据地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview

The train folder contains 25,000 images of dogs and cats. Each image in this folder has the label as part of the filename. The test folder contains 12,500 images, named according to a numeric id.

For each image in the test set, you should predict a probability that the image is a dog (1 = dog, 0 = cat).

# ---------cat vs dog-------------
# https://michael.blog.csdn.net/
import tensorflow as tf
import pandas as pd
import numpy as np
import random
import osnum_epochs = 10
batch_size = 32
learning_rate = 1e-4
train_data_dir = "./dogs-vs-cats/train/"
test_data_dir = "./dogs-vs-cats/test/"# 数据处理
def _decode_and_resize(filename, label=None):img_string = tf.io.read_file(filename)img_decoded = tf.image.decode_jpeg(img_string)img_resized = tf.image.resize(img_decoded, [256, 256]) / 255.if label == None:return img_resizedreturn img_resized, label# 使用 tf.data.Dataset 生成数据
def processData(train_filenames, train_labels):train_dataset = tf.data.Dataset.from_tensor_slices((train_filenames, train_labels))train_dataset = train_dataset.map(map_func=_decode_and_resize)# train_dataset = train_dataset.shuffle(buffer_size=25000) # 非常耗内存,不使用train_dataset = train_dataset.batch(batch_size)train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)return train_datasetif __name__ == "__main__":# 训练文件路径file_dir = [train_data_dir + filename for filename in os.listdir(train_data_dir)]labels = [0 if filename[0] == 'c' else 1for filename in os.listdir(train_data_dir)]# 打包并打乱f_l = list(zip(file_dir, labels))random.shuffle(f_l)file_dir, labels = zip(*f_l)# 切分训练集,验证集valid_ratio = 0.1idx = int((1 - valid_ratio) * len(file_dir))train_files, valid_files = file_dir[:idx], file_dir[idx:]train_labels, valid_labels = labels[:idx], labels[idx:]# 使用 tf.data.Dataset 生成数据集train_filenames, valid_filenames = tf.constant(train_files), tf.constant(valid_files)train_labels, valid_labels = tf.constant(train_labels), tf.constant(valid_labels)train_dataset = processData(train_filenames, train_labels)valid_dataset = processData(valid_filenames, valid_labels)# 建模 model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(256, 256, 3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Dropout(0.2),tf.keras.layers.Conv2D(64, 5, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Dropout(0.2),tf.keras.layers.Conv2D(128, 5, activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Dropout(0.2),tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(2, activation='softmax')])# 模型配置model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.metrics.sparse_categorical_accuracy])# 训练model.fit(train_dataset, epochs=num_epochs, validation_data=valid_dataset)# 测试 testtest_filenames = tf.constant([test_data_dir + filename for filename in os.listdir(test_data_dir)])test_data = tf.data.Dataset.from_tensor_slices(test_filenames)test_data = test_data.map(map_func=_decode_and_resize)test_data = test_data.batch(batch_size)ans = model.predict(test_data) # ans [12500, 2]prob = ans[:, 1] # dog 的概率# 写入提交文件id = list(range(1, 12501))output = pd.DataFrame({'id': id, 'label': prob})output.to_csv("submission.csv", index=False)

提交成绩:

榜首他人成绩:

  • 把模型改成 MobileNetV2 + FC,训练 2 个 epochs
basemodel = tf.keras.applications.MobileNetV2(input_shape=(256,256,3), include_top=False, classes=2)
model = tf.keras.Sequential([basemodel,tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(2, activation='softmax')
])

结果:

704/704 [==============================] - 179s 254ms/step 
- loss: 0.0741 - sparse_categorical_accuracy: 0.9737 
- val_loss: 0.1609 - val_sparse_categorical_accuracy: 0.9744
704/704 [==============================] - 167s 237ms/step 
- loss: 0.0128 - sparse_categorical_accuracy: 0.9955 
- val_loss: 0.0724 - val_sparse_categorical_accuracy: 0.9848

准确率(99%, 98%)比上面第一种模型高(第一种模型大概是训练集 92%, 验证集80%)

测试时,损失值竟然比上面的大,怎么解释?貌似第二种方案也没有过拟合吧,训练集和验证集准确率差不多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter 图解_【Flutter 专题】83 图解自定义 ACEWave 波浪 Widget (一)

和尚今天尝试一下绘制波浪的效果,虽然 pub 仓库中已经有成熟的插件,但和尚还是准备用之前学习的 Canvas 和 Animation 尝试自定义一个 ACEWave;1. 绘制曲线绘制波浪首先需要绘制曲线,采用 Canvas 绘制贝塞尔曲线;常用的…

c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了

小Hub领读:本文主要详细讲述常见的八种排序算法的思想、实现以及复杂度。包括冒泡排序、快速排序、插入排序、希尔排序等等,文章讲解非常详细!作者:静默虚空https://juejin.im/post/5cb6b8f551882532c334bcf2本文已归档到&#xf…

LintCode 1816. 使结果不超过阈值的最小除数(二分查找)

文章目录1. 题目2. 解题1. 题目 描述 给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。 请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个…

马里兰大学calce电池循环测试数据集_千次循环,全程1.5V恒压,紫米新一代充电锂电池套装上手体验...

电池应该是每个家庭都会用到的东西,在现在智能家电飞迅发展的当下更是如此,比如智能门锁、智能门铃,都需要电池的供电,才能正常使用。而普通碱电池在电量耗尽后就无法循环使用,所以为了能节省成本减少电池对环境的污染…

TensorFlow 2.0 - TFRecord存储数据集、@tf.function图执行模式、tf.TensorArray、tf.config分配GPU

文章目录1. TFRecord 格式存储2. tf.function 高性能3. tf.TensorArray 支持计算图特性4. tf.config 分配GPU学习于:简单粗暴 TensorFlow 2 1. TFRecord 格式存储 使用该种格式,更高效地进行大规模的模型训练 import random import os import tensorfl…

c++ qt qlistwidget清空_Qt编写控件属性设计器12-用户属性

一、前言用户属性是后面新增加的一个功能,自定义控件如果采用的Q_PROPERTY修饰的属性,会自动识别到属性栏中,这个一般称为控件属性,在组态设计软件中,光有控件本身的控件属性还是不够的,毕竟这些属性仅仅是…

TensorFlow 2.0 - tf.saved_model.save 模型导出

文章目录1. tf.saved_model.save2. Keras API 模型导出学习于:简单粗暴 TensorFlow 2 1. tf.saved_model.save tf.train.Checkpoint 可以保存和恢复模型中参数的权值导出模型:包含参数的权值,计算图 无须源码即可再次运行模型,适…

机器人动力学与控制_力控制与位置控制的区别

1.背景介绍目前已经广泛落地的力控制方案是在机械臂末端安装多轴力矩传感器,用以检测机械臂对外界环境施加的力反馈值,并配合适当的控制策略,已达到控制机械臂与环境的作用力。这篇文章所要探讨的力控制(上述力控制方案&#xff0…

基坑监测日报模板_基坑监测有多重要?实录基坑坍塌过程,不亲身经历,不知道现场有多恐怖!...

基坑整体坍塌不亲身经历,不知其恐怖▼前段时间,南宁绿地中央广场房地产项目D号地块(二期)基坑北侧约60米支护桩突然崩塌!所幸无人伤亡。深基坑施工安全生产管理要点一、基坑开挖 1、 临边防护(1)基坑施工必须按要求进行,具体临边防…

[转]asp.net导出数据到Excel的三种方法

原文出处:asp.net导出数据到Excel的几种方法(1/3) 、asp.net导出数据到Excel的几种方法(2/3)、asp.net导出数据到Excel的几种方法(3/3) asp.net导出到Excel也是个老生常谈的问题,在此归纳一下。 第一种是比较常用的方法。是利用控件的RenderControl功能…

LintCode 378. 将二叉树转换成双链表(非递归遍历)

文章目录1. 题目2. 解题1. 题目 将一个二叉树按照中序遍历转换成双向链表。 样例 样例 1&#xff1a; 输入:4/ \2 5/ \1 3 输出: 1<->2<->3<->4<->5样例 2&#xff1a; 输入:3/ \4 1输出:4<->3<->1https://www.lintcode.com/pro…

js 将图片置灰_艾叶灰千万别扔——艾叶灰的神奇功效

请 点 上面“经络技巧”免费关注每晚9点准时免费更新点击下面图片阅读↓↓↓—— 以下是正文 ——艾灰的妙用1、宝宝经常会有红屁股&#xff0c;做妈妈的当然心疼&#xff0c;用了不少膏啊霜啊油啊&#xff0c;效果也是反反复复&#xff0c;尤其害怕会有依赖性。在妈妈的提醒下…

LintCode 434. 岛屿的个数II(并查集)

文章目录1. 题目2. 解题1. 题目 给定 n, m, 分别代表一个二维矩阵的行数和列数, 并给定一个大小为 k 的二元数组A. 初始二维矩阵全0. 二元数组A内的k个元素代表k次操作, 设第 i 个元素为 (A[i].x, A[i].y), 表示把二维矩阵中下标为A[i].x行A[i].y列的元素由海洋变为岛屿. 问在…

jqprintsetup已经安装还会提示_Windows 10更新将修复困扰用户已久的循环安装问题...

对于某些设备的用户来说&#xff0c;过去一年一直深受 Windows Update 陷入循环更新的问题困扰&#xff0c;尤其是那些使用英特尔驱动程序的设备。问题在于 Windows Update 会提示错误地提供不适配的驱动或版本&#xff0c;并且强行覆盖安装。此外即便用户已经安装了更新更好的…

springboot设置运行内存_Docker 如何运行多个 Springboot?

docker 如何运行多个Springboot &#xff1f;第一个&#xff1a;端口映射第二个&#xff1a;指定内存大小第三个&#xff1a;读取、写入物理文件第四个&#xff1a;日志文件第五个&#xff1a;多个容器内部网络访问第六个&#xff1a;遇到的问题第一个&#xff1a;端口映射Ngin…

LintCode 1915. 举重(01背包)

文章目录1. 题目2. 解题1. 题目 奥利第一次来到健身房&#xff0c;她正在计算她能举起的最大重量。 杠铃所能承受的最大重量为maxCapacity&#xff0c;健身房里有 n 个杠铃片&#xff0c;第 i 个杠铃片的重量为 weights[i]。 奥利现在需要选一些杠铃片加到杠铃上&#xff0c;使…

python实现简单线性回归和多元线性回归算法

1、问题引入 在统计学中&#xff0c;线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归方程代表一条直线。我们需要对线性回归结…

form表单通过checkbox_飞冰表单解决方案 - FormBinder

前言中后台业务场景中&#xff0c;表单是一种很常见的与用户交互的方式&#xff0c;从业务角度看&#xff0c;表单主要是收集用户的信息&#xff0c;而从技术角度看&#xff0c;作为一个通用型的组件&#xff0c;它要解决的问题无非就是三个&#xff1a;把一个初始数据对象扔给…

@data 重写set方法_C#中的类、方法和属性

这节讲C#中的类&#xff0c;方法&#xff0c;属性。这是面向对象编程中&#xff0c;我们最直接打交道的三个结构。类&#xff1a;类(class)是面向对象中最基本的单元&#xff0c;它是一种抽象&#xff0c;对现实世界中事物的抽象&#xff0c;在C#中使用class关键字声明一个类&a…

Docker安装+镜像拉取+容器+创建镜像+push to docker hub

文章目录1. 安装2. 镜像操作3. 容器4. docker hub本文参考&#xff1a;https://zhuanlan.zhihu.com/p/23599229 1. 安装 参考 https://www.runoob.com/docker/ubuntu-docker-install.html curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun测试&#xff…