cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络

此次的cifar10和前面说的MNIST案例虽然主骨架是相同的,但是代码内部有很大的区别,相同点:他们都是采用了2层卷积+2层全连接
不同点:cifar10内部封装了数据增强的功能,而且在全连接层cifar10应用了L2正则项来约束w参数,防止过拟合,并没有采用MNIST的那种dropout,代码如下:
import tensorflow as tf
import numpy as np
import math
import time
from tutorials.image.cifar10 import cifar10
from tutorials.image.cifar10 import cifar10_input
#导入数据集和必要的包, tutorials是此案例的工程包里面包含的很多封装的算法

max_steps = 3000 # 3000次数
batch_size = 128 # 每个批次128张图片,正反向传播的时候

data_dir = ‘D:/cifar10_data/cifar-10-batches-bin’
cifar10.maybe_download_and_extract()

#下载cifar10类下载数据集,并解压,展开到其默认位置,检测有没有此数据
#如果没有的话就从官网去下载

images_train, labels_train = cifar10_input.distorted_inputs(
data_dir=data_dir, batch_size=batch_size
)

#因为此案例的重点就在于他对一些方法的封装,那么咱们首先来看看他的cifar10_input内部都有哪些东西,是干什么用的。

第一部分–源码解读

一、读取数据转换并打乱
cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络_第1张图片
他的上面还有一部分,是关于读取彩色图片的数据类型的一个转换,那块就不详细的说了,咱们来看看这里。
首先下面这几个功能总体是为了构建一个队列的图像和标签
1 将图片转换成3通道行列都有的这样一个矩阵。
2 将lable转换成一维向量
3 在队列中保留的最小样本数需要设置。
4 一个批次读取多少张图图片
5 shuffile打乱读取的图片顺序
6 返回:
images: Images. 4D tensor of [batch_size, height, width, 3] size.(一个四维的张量)
labels: Labels. 1D tensor of [batch_size] size.(标签一维的张量)

二、多线程16
cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络_第2张图片
1、表示封装了多线程,并且线程数量为16 ,thread。
2、如果训练集进行了图片顺序扰乱那么传入相关参数,并在在这里面也定义了线程池的规格和保留样本的最小数量。
3、如果没有打乱的话那么不设置保留样本的参数。

三、数据增强
cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络_第3张图片
1、data_dir, batch_size,表示传入文件,读取的批次数量。distorted_inputs的意思是对图片进行数据增强(包含有数据反转、剪切、对比度、位移等等),在这里不做详细的介绍,不过可以把源码展示出来大家有兴趣可以看看。cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络_第4张图片
2、读取数据,他将原来的传入的批次数据进行数据增强之后原数据集扩大了5倍,是原来的6倍,每个批次的数据都要经过这样的处理。他将读取的数据缓存起来。
3、遍历上面造出来的数据,相当于对数据进行一个检查,如果没有符合要求的话那么就会报错:Failed to find file

四、构建评估函数
cifar10案例(cifar10—input.py重点),彩色图片卷积神经网络_第5张图片
1、使用读者操作系统为CIFAR评估构建输入。相当于为评估模型去封装一个函数。
2、参数
3、参数
本评估函数后续的代码不在这里进行展示,大家可以跳入cifar10—input.py中的最下面的一个函数封装去查看里面内部的详细操作。
总结
:此cifar10—input.py封装了4大方法,依次为 读取数据转换并打乱、多线程、 数据增强、构建评估函数–缕清思路很重要啊!

第二部分–代码解读

一、
images_test, labels_test = cifar10_input.inputs(eval_data=True, data_dir=data_dir, batch_size=batch_size)
#生成测试数据,不过这里不需要进行太多处理,不需要对图片进行翻转或修改亮度、对比度,不过需要裁剪图片正中间的24*24大小的区块,
#并进行数据标准化操作
#eval_data = Ture 的原因是测试集和训练集都从不同的文件里面读数据,这也和上面的多线程逻辑想通,只有从不同的文件里面读数据,那么
#数据才不会重复和覆盖,多线程才能执行不同的任务(对Ture的逻辑说明在input源码里面)。
二、
def variable_with_weight_losses(shape, stddev, wl):
# 定义初始化weights的函数,和之前一样依然使用tf.truncated_normal截断的正太分布来初始化权值
var = tf.Variable(tf.truncated_normal(shape, stddev=stddev))
if wl is not None:
# 给weight加一个L2的loss,相当于做了一个L2的正则化处理
# 在机器学习中,不管是分类还是回归任务,都可能因为特征过多而导致过拟合,一般可以通过减少特征或者惩罚不重要特征的权重来缓解这个问题
# 但是通常我们并不知道该惩罚哪些特征的权重,而正则化就是帮助我们惩罚特征权重的,即特征的权重也会成为模型的损失函数的一部分
# 我们使用w1来控制L2 loss的大小
weight_loss = tf.multiply(tf.nn.l2_loss(var), wl, name=‘weight_loss’)
# 我们使用tf.add_to_collection把weight loss统一存到一个collection,这个collection名为"losses",它会在后面计算神经网络
# 总体loss时被用上
tf.add_to_collection(“losses”, weight_loss)
return var
#L1正则是|w|加和,L2是正则w的平方加和
#batch Normoliztion 常用归一化
此函数的重点是w,在卷积这块没有什么用,但是在全连接那里来用,所以在卷积这里他的参数是0.0

你可能感兴趣的:(卷积神经网络)