Tensorflow实现图像分类

利用tensorflow做图像分类的训练,主要分为读取图像,训练批次,定义模型,训练,保存模型,模型调用几步。
首先是读取图像,利用python中os模块的listdir方法来读取图像。在这里可以把每一类的图像放到同一文件夹中,文件夹的名字可以直接作为图像的标签,最好是用数字代替,图像的名字最好也是数字,这样写代码比较方便,如图:


读取图像的代码如下:

接下来要做的就是生成训练批次了,因为tensorflow训练的数据必须是Tensor类型,下面的tf.train.slice_input_producer()函数,就是一个Tensor生成器,介绍一下这个函数。
tf.train.slice_input_producer(tensor_list, num_epochs, shuffle=True, seed=None, capacity=32, shared_name=None, name=none)
参数tensor_list:包含一个tensor列表,表中tensor的第一维度的值必须相等,即个数必须相等,有多少个图像,就应该有多少个对应的标签。
第二个参数num_epochs: 可选参数,是一个整数值,代表迭代的次数,如果设置 num_epochs=None,生成器可以无限次遍历tensor列表,如果设置为 num_epochs=N,生成器只能遍历tensor列表N次。
第三个参数shuffle: bool类型,设置是否打乱样本的顺序。一般情况下,如果shuffle=True,生成的样本顺序就被打乱了,在批处理的时候不需要再次打乱样本,使用 tf.train.batch函数就可以了;如果shuffle=False,就需要在批处理时候使用 tf.train.shuffle_batch函数打乱样本。
第四个参数seed: 可选的整数,是生成随机数的种子,在第三个参数设置为shuffle=True的情况下才有用。
第五个参数capacity:设置tensor列表的容量。
第六个参数shared_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor。
第七个参数name:可选,设置操作的名称。
设置好输入队列之后,读取图像数据,这里的label暂不处理,然后利用tf.read_file读取图像,读取后的图像是string类型的Tensor,所以接下来需要用tf.image.decode_jpeg进行解码,当然这里是jpg类型的图片,如果是其他类型的图片,还有其他的解码函数,在这里的channels = 3表示的是返回的是三通道的RGB图像,函数的返回值是uint8类型的Tensor。
tf.image.resize_image_with_crop_or_pad(image, target_height, target_width)这个函数的作用是将图像剪切为需要的大小,并且保持横纵比不变,这是因为tensorflow在训练时要求所有图像的大小都是一样的,为了防止图像的大小影响训练,所有必须要处理图像的大小。处理之后,对图像进行标准化。然后就是tf.train.batch函数,这个函数的功能是利用一个tensor的列表或字典来获取一个batch数据,
tf.train.batch(
tensors, # 一个列表或字典的tensor用来进行入队
batch_size, #设置每次从队列中获取出队数据的数量
num_threads=1, #用来控制入队tensors线程的数量,如果num_threads大于1,则batch操作将是非确定性的,输出的batch可能会乱序
capacity=32, #一个整数,用来设置队列中元素的最大数量
enqueue_many=False, #在tensors中的tensor是否是单个样本
shapes=None, #可选,每个样本的shape,默认是tensors的shape
dynamic_pad=False, #Boolean值.允许输入变量的shape,出队后会自动填补维度,来保持与batch内的shapes相同
allow_smaller_final_batch=False, #可选,Boolean值,如果为True队列中的样本数量小于batch_size时,出队的数量会以最终遗留下来的样本进行出队,如果为Flalse,小于batch_size的样本不会做出队处理
shared_name=None, #可选,通过设置该参数,可以对多个会话共享队列
name=None #可选,操作的名字
)
最后,还要将数据的数据类型转换为可用于训练的类型

接下来就要定义训练是的卷积层以及每层的参数,首先要知道,cnn的包括卷积层,池化层和正则化层,卷积层的方法tf.nn.conv2d函数
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

input:指卷积需要输入的参数,具有这样的shape[batch, in_height, in_width, in_channels],分别是[batch张图片, 每张图片高度为in_height, 每张图片宽度为in_width, 图像通道为in_channels]。
filter:指用来做卷积的滤波器,当然滤波器也需要有相应参数,滤波器的shape为[filter_height, filter_width, in_channels, out_channels],分别对应[滤波器高度, 滤波器宽度, 接受图像的通道数, 卷积后通道数],其中第三个参数 in_channels需要与input中的第四个参数 in_channels一致,out_channels第一看的话有些不好理解,如rgb输入三通道图,我们的滤波器的out_channels设为1的话,就是三通道对应值相加,最后输出一个卷积核。
strides:代表步长,其值可以直接默认一个数,也可以是一个四维数如[1,2,1,1],则其意思是水平方向卷积步长为第二个参数2,垂直方向步长为1.其中第一和第四个参数我还不是很明白,请大佬指点,貌似和通道有关系。
padding:代表填充方式,参数只有两种,SAME和VALID,SAME比VALID的填充方式多了一列,比如一个33图像用22的滤波器进行卷积,当步长设为2的时候,会缺少一列,则进行第二次卷积的时候,VALID发现余下的窗口不足2*2会直接把第三列去掉,SAME则会填充一列,填充值为0。
use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true。大概意思是是否使用gpu加速,还没搞太懂。
name:给返回的tensor命名。给输出feature map起名字。

池化函数:tf.nn.max_pool(value, ksize, strides, padding, name=None)

value:池化的输入,一般池化层接在卷积层的后面,所以输出通常为feature map。feature map依旧是[batch, in_height, in_width, in_channels]这样的参数。
ksize:池化窗口的大小,参数为四维向量,通常取[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1。ps:估计面tf.nn.conv2d中stries的四个取值也有相同的意思。
stries:步长,同样是一个四维向量。
padding:填充方式同样只有两种不重复了。

在这里要提一下加权重和偏置这个问题,可以理解为原本的训练是y = x,这里权重是w,偏置是b的话,那么训练的结果就变成了y = wx + b,这里需要自己设置权重和偏置的值。这里的权重可能不好理解,其实就是用来生成卷积核的shape。
tf.Variable(tf.random_normal([3,3,3,16],stddev = 0.01))
这里的卷积核就是由这个函数生成的,其中的shape中的几个数据的含义为,卷积核的高度,滤波器的宽度,图像通道数,滤波器个数。


如图,三次卷积池化之后,用激活函数relu激活。然后定义损失函数以及评价分类准确率的量,训练时,需要loss值减小,准确率增加,这样的训练才是收敛的。
损失函数

评估量

训练

最后,还有附上主函数代码

Tensorflow实现图像分类相关推荐

  1. 【深度学习系列】用Tensorflow进行图像分类

    上个月发布了四篇文章,主要讲了深度学习中的"hello world"----mnist图像识别,以及卷积神经网络的原理详解,包括基本原理.自己手写CNN和paddlepaddle的 ...

  2. 使用PaddleFluid和TensorFlow实现图像分类网络SE_ResNeXt | 文末超大福利

    专栏介绍:Paddle Fluid 是用来让用户像 PyTorch 和 Tensorflow Eager Execution 一样执行程序.在这些系统中,不再有模型这个概念,应用也不再包含一个用于描述 ...

  3. 基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门

    1. 人工神经网络 1.1 神经网络结构 人工神经网络(简称神经网络)是模拟人类大脑神经元构造的一个数学计算模型. 一个神经网络的搭建,需要满足三个条件. 输入和输出 权重(w)和阈值(b) 多层感知 ...

  4. TensorFlow——[基本图像分类]fashion-mnist及mnist_reader.py运行错误[TypeError: Invalid dimensions for image data]

    问题描述 无. 问题分析 问题关键理解imshow函数的参数. matplotlib.pyplot.imshow()需要数据是二维的数组或者第三维深度是3或4的三维数组,当第三维深度为1时,使用np. ...

  5. tensorflow随笔——图像分类、检测,语义分割综述

    看到一篇关于目标分类/检测/风格的综述型文章,觉得写的挺好,收藏下. 本文旨在介绍深度学习在计算机视觉领域四大基本任务中的应用,包括分类(图a).定位.检测(图b).语义分割(图c).和实例分割(图d ...

  6. 求问大神指点,tensorflow的图像分类模型进行android移植的时候出现了如下报错

    03-28 17:20:53.554 32373-32373/? I/art: Late-enabling -Xcheck:jni 03-28 17:20:53.559 32373-32373/? I ...

  7. tensorflow实现图像分类解决病虫害识别问题

    一,任务 本次做的是一个小麦水稻病虫害识别问题,使用tensorflow,利用CNN提取图片像素特征进行分类,并达到了一定的效果. 二,数据准备 为了防止过拟合,数据预处理阶段分别经过亮度增强,对比度 ...

  8. tensorflow遥感图像分类_在线讲座 | 高分辨率遥感图像目标检测和场景分类研究进展...

    近年来,深度学习技术驱动的高分辨率遥感图像目标检测和场景分类取得了重大研究进展.由于深度学习的快速发展,导致相关研究进展很难被跟进,特别是对于刚踏入该领域的研究者而言.● 该领域的研究还面临哪些挑战和 ...

  9. Python图像处理:使用TensorFlow或Keras进行图像分类

    在本节中,我们将重新讨论手写数字分类的问题(使用MNIST数据集),但这次使用的是深度神经网络,即使用两个非常流行的深度学习库TensorFlow和Keras来解决这个问题.TensorFlow(TF ...

最新文章

  1. Apache RocketMQ Meetup深圳首秀 引开源爱好者追捧
  2. 如何在WCF中用TcpTrace工具查看发送和接收的SOAP消息
  3. Spring Cloud的应用程序—上下文服务
  4. 腾讯发出合并邀约:斗鱼股价下跌8.51%,虎牙下跌9.83%
  5. 上市公司与不上市公司的区别
  6. 有哪些关于iPhone使用的小技巧?
  7. filebeat配置介绍
  8. windows 8.1无人值守安装
  9. JavaScript通过百度OCR实现图像文字识别及常见错误解释
  10. 小白量化彩票实战(5)彩票号码快速生成组合及利用数据库生成彩票号码组合
  11. iFixit 拆解 2014 款 Mac mini拆机教程, 内存确认不能更换.
  12. Spark 学习笔记——001【spark-mysql+spark-hive】
  13. 深空时代来临,探日究竟有何魔力?
  14. 尘福通:智慧城市建设、运营、演进路径思考
  15. xp系统网上邻居看不到局域网电脑_网上邻居看不到局域网的其它计算机名
  16. 打破数据围墙 加速金融创新
  17. MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
  18. IDEA使用--字体、编码和基本设置
  19. 纸质合同为什么要升级为电子合同?区别在哪?
  20. 交互方式的系统总结:如何让App拥有一个有趣的“灵魂”?

热门文章

  1. 15 Redis缓存及常用数据类型
  2. backdoor-factory详细使用教程
  3. c++string 加引号_朋友圈晒图,为什么越来越多的人喜欢加“白边”?
  4. 橡皮筋类 QRubberBand
  5. werkzeug 详解
  6. SQL分析品牌在2019.5-2020.4期间的复购率(复购率理解、inner join)
  7. linux中删除特殊名称文件
  8. html与css重置代码,HTML CSS标签类型转换、样式重置 、前段规范(示例代码)
  9. SLOPE函数通过两类产品的测试结果返回线性回归直线的斜率
  10. 【pwn学习】pwn中常用工具