《21个项目玩转深度学习--基于tensorflow的实践详解》代码实现和笔记(一)

一、首先尝试

获取数据集的时候会报一个warning,但是发现这个对后面数据集的获取并没有影响,print数据集的shape的时候可以输出
在这里插入图片描述
输出训练集验证集以及测试集的shape大小
在这里插入图片描述
接下来尝试从数据集中读取20张样本,并将其保存哼图像文件(这里需要注意的1.是读取的数据集的shape大小是55000784的,后面的784指的是每个图像的维度,也就是这张图象的大小,在数据集中他是个1784的向量,再保存时需要将其恢复成28*28的文件草能变成标准的图像文件2.保存路径的raw后面如果不加/的话是没法保存到raw文件夹中的)
在这里插入图片描述
保存的文件
在这里插入图片描述

二、使用softmax建立一个简单的分类器

首先和之前一样需要导入训练数据并且引用tensorflow,然后要建立两个临时的变量用来存放每一次循环需要的图像数据以及标签,它们分别为x和y_(因为y定义为softmax预测的标签结果)
在tensorflow中这种临时变量用tf.Variable来创建(注意这里大小写,用小写会报错)
创建y变量用来存放用softmax预测的结果,用于结果比对
在这里插入图片描述
然后定义计算正确值与预测结果的loss值,这里应用了交叉熵损失来进行度量(其中的tf.log(y)推测是使用了log对数损失函数)之后定义梯度下降来更新之前的两个参数W和b(其中的0.01为定义的学习率)
要注意的是在执行梯度下降的时候要首先定义一个会话session,进行梯度下降的过程中出现的一些类似于“缓存”的东西都会保存在会话中,因此需要定义一个会话并且梯度下降前先初始化会话
在这里插入图片描述
之后利用循环对这个分类器进行训练,首先使用1000次循环,每次使用100个样本进行训练(其中每次使用的训练数据使用的数据使用feed_dict预先定义,类似于之前的变量,然后每次随机从数据集中取100个放到里面)最后计算准确率
在这里插入图片描述
之后又做了循环10000次和20000次(100样本)的实验,发现准确率并没有很大的提升,应该是它也就这么大的能力了

在这里插入图片描述
在这里插入图片描述

三、使用tensorflow实现一个简单的卷积神经网络

首先和以前一样需要导入tensorflow模块并且读取数据集,然后建立两个用于读取数据集和标签的两个临时变量x和y_
在这里插入图片描述
因为需要用到卷积操作,因此需要将读取的图片reshape成标准的2828的格式,而不是1784的一维的形式,为了方便之后的卷积神经网络的编写,我们将需要用到的模块写好在一个python脚本中,在之后直接引用即可,并且在开头直接引用,我们为他起名为package.py,其中的函数如图
其中,tf.truncated_normal是从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。这是一个截断的产生正太分布的函数,就是说产生正太分布的值如果与均值的差值大于两倍的标准差,那就重新生成。这里应该是用来生成一个5x5大小的32个卷积核(?)
tf.constant函数用来创建一个常量,tf.nn.conv2d是一个内置的二位卷积函数,输入为x,权重为W,步长为1,四周的填充方式为same,表示卷积核可以停留在图像边缘
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:
第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一
第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维
第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式(后面会介绍)
第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true
结果返回一个Tensor,这个输出,就是我们常说的feature map,shape仍然是[batch, height, width, channels]这种形式。

tf.nn.max_pool表示池化层,用法如下
tf.nn.max_pool(value, ksize, strides, padding, name=None)
参数是四个,和卷积很类似:
第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape
第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1
第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
第四个参数padding:和卷积类似,可以取’VALID’ 或者’SAME’
返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

在这里插入图片描述
然后我们在刚才的脚本的开头添加一行,将写好的函数导入
在这里插入图片描述
然后我们便可以开始写网络结构了,首先添加一个卷积层,然后使ReLu激活函数,再添加一个池化层
在这里插入图片描述
为了增加分类的准确率,我们再增加一个卷积层
在这里插入图片描述
然后添加一个全连接层,其中要进行dropout操作,目的是防止过拟合。所谓过拟合通俗是指模型只能很好的适应训练集,但是对其他样本数据却不能很好的进行预测或分类,这里dropout设定为0.5,代表有百分之五十的连接将被失活。
在这里插入图片描述
最后再添加一个全连接层,将所有1024维转换为10维从而输出分类结果(问题:为什么全连接要先弄成1024维再转化为10 维,其中的7764是为什么)
最后的步骤就是定义交叉熵损失并计算准确率等结果了,这里很值钱基本一样,就不多说了。
在这里插入图片描述
最后的准确率达到了97.49
在这里插入图片描述
最后总结一下所实现的网络结构,如图
在这里插入图片描述
四、CIFAR10数据集实验
首先,需要先获取cifar10这个数据集,此数据集是彩色的,这是与mnist数据集的不同之处,此外它包含了生活中的常见物体。
在实验开始之前,先要获取数据集,这里使用图中的代码获取下载数据集
在这里插入图片描述
其中,tf.app.flags.FLAGS用于存放实验过程中的变量,flags.data_dir存放的是cifar数据集的存放位置,其他的关于数据集读取和在内存中的机制问题没有仔细研究,这周仔细看一下。
在深度学习中,需要大量的样本数据对模型进行训练,但是往往没有如此多的数据量。因此,我们常用图像增强技术来增加样本数据的数据量。比如,在之前的DRCNN模型中,就使用了在图像中添加高斯噪声的方式从而增加了一倍的数据量。常用的图像增强技术有以下几种
在这里插入图片描述

需要指出的是,图像增强之后并能改变其标签,比如不能一只青蛙在图像增强之后变成了一只乌龟。这就要求不能改变图像的性质,只改变其图像的一些参数。
下面使用CIFAR10数据集进行分类实验,此次网络结构主体还是使用了CNN网络,其整个网络结构如下图所示
在这里插入图片描述
内部代码主体结构与mnist分类类似,已经封装好,因此我们首先进行训练
使用python cifar10_train.py --train_dir cifar10_train/ --data_dir cifar10_data/ 命令执行训练程序
执行训练程序后其loss不断减少
在这里插入图片描述
此外,在使用tensorflow的时候,官方为我们提供了tensorboard这个可视化的图形工具,方便我们观察每一步的损失、学习率等数据
在这里插入图片描述
在训练的过程中,tensorflow会每五分钟把训练的模型保存在checkpoint(ckpt)文件中,在执行完训练之后,我们检测一下训练好的模型在测试机上的准确率,使用内置函数cifar10——eval命令
进入cmd然后进入当前目录,执行命令python cifar10_eval.py --data_dir cifar10_data/ --eval_dir cifar10_eval/ --checkpoint_dir cifar10_train/
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值