TensorFlow实现对花朵数据集的图片分类(保证运行成功)
文章目录
- 前言
- 一、数据集
- 二、代码
- 1.下载数据集
- 2.统计并观察数据
- 3,构建数据集
- 4,迁移学习进行分类
前言
利用TensorFlow实现对花朵数据集的图片分类
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据集
数据集是五个分别存放着对应类别花朵图片的五个文件夹,包括daisy(雏菊)633张;dandelion(蒲公英)898张,rose(玫瑰)641张,sunflower(向日葵)699张,tulips(郁金香)799张。
二、代码
1.下载数据集
import tensorflow as tf
AUTOTUNE = tf.data.experimental.AUTOTUNE
import pathlib
data_root_orig = tf.keras.utils.get_file(origin='https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz', fname='flower_photos', untar=True)
data_root = pathlib.Path(data_root_orig)
print(data_root)
for item in data_root.iterdir(): print(item)
打印下载后的文件路径和文件成员:
output:C:\Users\Administrator.keras\datasets\flower_photos
C:\Users\Administrator.keras\datasets\flower_photos\daisy
C:\Users\Administrator.keras\datasets\flower_photos\dandelion
C:\Users\Administrator.keras\datasets\flower_photos\LICENSE.txt
C:\Users\Administrator.keras\datasets\flower_photos\roses
C:\Users\Administrator.keras\datasets\flower_photos\sunflowers
C:\Users\Administrator.keras\datasets\flower_photos\tulips
2.统计并观察数据
#获取五个文件夹的名字
label_names = sorted(item.name for item in data_root.glob('*/') if item.is_dir())
label_names
output:[‘daisy’, ‘dandelion’, ‘roses’, ‘sunflowers’, ‘tulips’]
#将文件夹的名字(即花的分类)标上序号
label_to_index = dict((name, index) for index, name in enumerate(label_names))
label_to_index
{‘daisy’: 0, ‘dandelion’: 1, ‘roses’: 2, ‘sunflowers’: 3, ‘tulips’: 4}
#获取所以图片的标签(0,1,2,3,4)
import random
all_image_paths = list(data_root.glob('*/*'))
all_image_paths = [str(path) for path in all_image_paths]
random.shuffle(all_image_paths)
image_count = len(all_image_paths)
image_countall_image_labels = [label_to_index[pathlib.Path(path).parent.name]for path in all_image_paths]
print("First 10 labels indices: ", all_image_labels[:10])
3670
First 10 labels indices: [0, 2, 3, 4, 2, 1, 4, 1, 4, 0]
下面我们先来观察一张图片
#观察第一张图片
img_path = all_image_paths[0]
img_path
‘C:\Users\Administrator\.keras\datasets\flower_photos\daisy\11124324295_503f3a0804.jpg’
#读取原图
img_raw = tf.io.read_file(img_path)
#转换成TensorFlow可以使用的tensor类型
img_tensor = tf.image.decode_image(img_raw)
print(img_tensor.shape)
print(img_tensor.dtype)
(309, 500, 3)
<dtype: ‘uint8’>
#对图片按要求进行转换,这里将size规定到【192,192】;值域映射到【0,1】
img_final = tf.image.resize(img_tensor, [192, 192])
img_final = img_final/255.0
print(img_final.shape)
print(img_final.numpy().min())
print(img_final.numpy().max())
(192, 192, 3)
0.0
0.99984366
定义预处理和加载函数
def preprocess_image(image): image = tf.image.decode_jpeg(image, channels=3) image = tf.image.resize(image, [192, 192]) image /= 255.0 # normalize to [0,1] range return imagereturn image
def load_and_preprocess_image(path): image = tf.io.read_file(path) return preprocess_image(image)
导入matpoltlib进行画图(导入失败的解决方案见我的另一篇博文)
import matplotlib.pyplot as plt
image_path = all_image_paths[0]
label = all_image_labels[0]
print (load_and_preprocess_image(img_path))
plt.imshow(load_and_preprocess_image(img_path))
plt.grid(False)
3,构建数据集
使用tf.data.Dataset来构建规范的数据集
#“from_tensor_slices ”方法使用张量的切片元素构建图片路径的数据集
path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
#同理,构建标签数据集,并用tf.cast转换成int64数据类型
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64))
#根据路径获取图片,并经过加载和预处理得到图片数据集
image_ds = path_ds.map(load_and_preprocess_image )
image_ds
<MapDataset shapes: (192, 192, 3), types: tf.float32>
将image_ds和label_ds打包成新的数据集
image_label_ds = tf.data.Dataset.zip((image_ds, label_ds))
print(image_label_ds)
<ZipDataset shapes: ((192, 192, 3), ()), types: (tf.float32, tf.int64)>
画图查看我们构造完成的新数据
plt.figure(figsize=(8,8))
for n,image_label in enumerate(image_label_ds.take(4)):plt.subplot(2,2,n+1)plt.imshow(image_label[0])plt.grid(False)
4,迁移学习进行分类
接下来用创建的数据集训练一个分类模型,简单起见,直接用tf.keras.applications包中训练好的模型,并将其迁移到我们的图片分类问题上来。这里使用的模型是MobileNetV2模型
#迁移MobileNetV2模型,并且不加载顶层
base_model=tf.keras.applications.mobilenet_v2.MobileNetV2(include_top=False,weights='imagenet',input_shape=(192,192,3))
inputs=tf.keras.layers.Input(shape=(192,192,3))#模型可视化1,使用model.summary()方法
base_model.summary()
接下来,我们打乱一下数据集,并定义好训练过程中每个批次(Batch)数据的大小
#使用shuffle方法打乱数据集
image_count = len(all_image_paths)
ds = image_label_ds.shuffle(buffer_size = image_count)
#让数据集重复多次
ds = ds.repeat()
#设置每个批次的大小
BATCH_SIZE = 32
ds = ds.batch(BATCH_SIZE)
#通过prefetch方法让模型的训练和每个批次数据的加载并行
ds = ds.prefetch(buffer_size = AUTOTUNE)
然后,针对MobileNetV2改变一样数据集的取值范围,因为MobileNetV2接受输入的数据值域是【-1,1】,而我们之前的预处理函数将图片的像素值映射到【0,1】
def change_range(image,label):return 2*image-1,label
keras_ds = ds.map(change_range)
接下来定义模型,由于预训练好的MobileNetV2返回的数据维度是(32,6,6,128),其中32是一个批次Batch的大小,“6,6”是输出的特征的大小为6*6,1280代表该层使用的1280个卷积核。为了使用花朵分类问题,需要做一下调整
model = tf.keras.Sequential([base_model,tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(len(label_names),activation="softmax")])
如上代码,我们用Sequentail建立我们的网络结构,base_model是迁移过来的模型,我们添加了全局评价池化层GlobalAveragePooling,经过此操作6*6的特征被降维,变为(32,1280)。最后,由于该分类问题有五个结果,我们增加一个全连接层(Dense)将维度变为(32,5)。
最后,编译一下模型,同时制定使用的优化器,损失函数和评价标准
model.compile(optimizer = tf.keras.optimizers.Adam(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()
使用model.fit训练模型,epochs是训练的回合数,step_per_epoch代表每个回合要去多少个批次数据。通常等于我们数据集大小除以批次大小后取证(3670/32≈10)
model.fit(ds,epochs=10,steps_per_epoch=100)
虽然没有跑完整个代码,但是已经能看出来准确度达到一个很高的程度,并在逐步上升。
TensorFlow实现对花朵数据集的图片分类(保证运行成功)相关推荐
- 【tensorflow 深度学习】8.训练图片分类模型
1.训练图片分类模型的三种方法 (1).从无到有,先确定好算法框架,准备好需要训练的数据集,从头开始训练,参数一开始也是初始化的随机值,一个批次一个批次地进行训练. (2).准备好已经训练好的模型,权 ...
- 深度学习基础实战使用MNIST数据集对图片分类
本文代码完全借鉴pytorch中文手册 '''我们找到数据集,对数据做预处理,定义我们的模型,调整超参数,测试训练,再通过训练结果对超参数进行调整或者对模型进行调整.''' import torch ...
- 【经典算法必读】图片分类系列之(一): 你真的了解图片分类(Image Classification)吗?...
欢迎关注我的个人微信公众号:小纸屑 图片分类是机器学习经典问题,也是深度学习声名鹊起之作.正是2012年AlexNet在图片分类竞赛ImageNet出乎寻常的性能,使得深度学习一夜爆红,方有今天人工智 ...
- (学生快速上手向)python图片分类识别器
本文着重讲不学无术的大学生如何快速上手跑出结果.本项目基于resnet34识别四类示意图,由cat vs dog项目改写而来.文末会说明如何快速把它改成你想要的项目(图片二分类等). 项目代码.数据集 ...
- 求助,在使用TensorFlow进行花朵图片分类时,想把数据集的图片转化为tfrecord文件,但是程序运行后没有反应,不知道问题出在哪里
求助,在使用TensorFlow进行花朵图片分类时,想把数据集的图片转化为tfrecord文件,但是程序运行后没有反应,一直显示服务空闲,不知道问题出在哪里,一下是我的程序,希望可以指点我一下哪里出了 ...
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测
DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...
- DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
DL之LiR&DNN&CNN:利用LiR.DNN.CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测 目录 输出结果 设计思路 核心代码 输出结果 数据集:Da ...
- TensorFlow精进之路(十六):使用slim模型库对图片分类
1.概述 TF-slim是tensorflow的一个轻量级库,它将很多常见tensorflow函数进行封装,使的模型的构建.训练.测试都更加简洁,特别适用于构建结构复杂的深度神经网络.github地址 ...
- TF之GD:基于tensorflow框架搭建GD算法利用Fashion-MNIST数据集实现多分类预测(92%)
TF之GD:基于tensorflow框架搭建GD算法利用Fashion-MNIST数据集实现多分类预测(92%) 目录 输出结果 实现代码 输出结果 Successfully downloaded t ...
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...
最新文章
- PostgreSQL 电商业务(任意维度商品圈选应用) - json包range数组的命中优化 - 展开+索引优化...
- Windows操作系统启动介绍(二)
- opencv 常见细碎问题解决
- 四个小时不止是敲了30多行代码,还懂了好多
- MiniGUI编程--组合框
- linux按括号截取字符串,Linux作业4
- 改进版1--编译目录下代码
- aws rds监控慢sql_使用AWS Backup备份AWS RDS SQL Server数据库
- mysql workbench中文设置 mac系统,win系统,linux系统
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration
- 20多个Maven命令和选项(备忘单)
- C 中的左值(Lvalues)和右值(Rvalues)
- linux客户端掉线重连,SSH自动断开后重连的解决方案
- 软考中高项学员:2016年4月4日作业
- Red5流媒体服务器的搭建与使用
- joc杂志影响因子2019_化学sci期刊影响因子排名_国际化学期刊2018最新影响因子_分析测试学报影响因子...
- linux系统论文题目大全_linux毕业设计
- WPS_Word空白页删除
- 通过Wachete实时监控网站更新
- 单播、广播、组播的区别(转)
热门文章
- Centos 6 之samba 搭建
- Java Design Demo -简单的队列-异步多任务队列(java android)
- 循序渐进 OSPF的详细剖析(二)
- Java反射原理与Class类(详解)
- [Java][Android] 多线程同步-主线程等待所有子线程完成案例
- [JNI] 开发基础(5)内存分配
- 第一部分 第四章 1059-1101 答案合集
- oracle的监听服务详解
- 连接服务器成功获取角色信息,客户端 获取 服务器 角色属性
- html2canvas提升像素,jspdf + html2canvas 实现html转pdf (提高分辨率版本)