浅笑の博客

我们的征途是星辰大海


  • 首页

  • 标签29

  • 分类6

  • 归档47

  • 留言板

  • 搜索

TensorFlow学习笔记12:CIFAR-10数据集图片分类

发表于 2019-08-23 分类于 深度学习 , Python Valine: 本文字数: 4.7k

CIFAR-10数据集简介

官网链接:http://www.cs.toronto.edu/~kriz/cifar.html

CIFAR-10是一个更接近普适物体的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10个类别的RGB彩色图片:飞机( airplane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。每个图片的尺寸为32 × 32 ,每个类别有6000个图像,数据集中一共有50000 张训练图片和10000 张测试图片。

CIFAR-10

TensenFlow实现

数据准备

首先去官方库下载cifar10.py以及cifar10_input.py文件来下载CIFAR-10数据集二进制文件,以及读取文件内容。

GitHub地址:https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10

运行下载数据集函数

1
2
from tensorflow.models.tutorials.image.cifar10 import cifar10
cifar10.maybe_download_and_extract()

数据集文件默认下载在./tmp/cifar10_data文件下,可以将其移动到自己的工程文件夹下

定义函数

首先定义一个权重初始化函数

1
2
3
4
5
6
def variable_with_weight_loss(shape,std,w1):
var = tf.Variable(tf.truncated_normal(shape,stddev=std),dtype=tf.float32)
if w1 is not None:
weight_loss = tf.multiply(tf.nn.l2_loss(var),w1,name="weight_loss")
tf.add_to_collection("losses",weight_loss)
return var

然后定义一个损失函数

1
2
3
4
5
6
7
def loss_func(logits,labels):
labels = tf.cast(labels,tf.int32)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,
labels=labels,name="cross_entropy_per_example")
cross_entropy_mean = tf.reduce_mean(tf.reduce_sum(cross_entropy))
tf.add_to_collection("losses",cross_entropy_mean)
return tf.add_n(tf.get_collection("losses"),name="total_loss")

读取数据

1
2
3
4
5
6
7
8
9
10
11
#设置每次训练的数据大小
batch_size = 128
#下载解压数据
# cifar10.maybe_download_and_extract()
# 设置数据的存放目录
cifar10_dir = "cifar10_data/cifar-10-batches-bin"
#获取数据增强后的训练集数据
images_train,labels_train = cifar10_input.distorted_inputs(cifar10_dir,batch_size)
#获取裁剪后的测试数据
images_test,labels_test = cifar10_input.inputs(eval_data=True,data_dir=cifar10_dir,
batch_size=batch_size)

网络结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 #定义模型的输入和输出数据
image_holder = tf.placeholder(dtype=tf.float32,shape=[batch_size,24,24,3])
label_holder = tf.placeholder(dtype=tf.int32,shape=[batch_size])

#设计第一层卷积
weight1 = variable_with_weight_loss(shape=[5,5,3,64],std=5e-2,w1=0)
kernel1 = tf.nn.conv2d(image_holder,weight1,[1,1,1,1],padding="SAME")
bais1 = tf.Variable(tf.constant(0.0,dtype=tf.float32,shape=[64]))
conv1 = tf.nn.relu(tf.nn.bias_add(kernel1,bais1))
pool1 = tf.nn.max_pool(conv1,[1,3,3,1],[1,2,2,1],padding="SAME")
norm1 = tf.nn.lrn(pool1,4,bias=1.0,alpha=0.001 / 9,beta=0.75)

#设计第二层卷积
weight2 = variable_with_weight_loss(shape=[5,5,64,64],std=5e-2,w1=0)
kernel2 = tf.nn.conv2d(norm1,weight2,[1,1,1,1],padding="SAME")
bais2 = tf.Variable(tf.constant(0.1,dtype=tf.float32,shape=[64]))
conv2 = tf.nn.relu(tf.nn.bias_add(kernel2,bais2))
norm2 = tf.nn.lrn(conv2,4,bias=1.0,alpha=0.01 / 9,beta=0.75)
pool2 = tf.nn.max_pool(norm2,[1,3,3,1],[1,2,2,1],padding="SAME")

#第一层全连接层
reshape = tf.reshape(pool2,[batch_size,-1])
dim = reshape.get_shape()[1].value
weight3 = variable_with_weight_loss([dim,384],std=0.04,w1=0.004)
bais3 = tf.Variable(tf.constant(0.1,shape=[384],dtype=tf.float32))
local3 = tf.nn.relu(tf.matmul(reshape,weight3)+bais3)

#第二层全连接层
weight4 = variable_with_weight_loss([384,192],std=0.04,w1=0.004)
bais4 = tf.Variable(tf.constant(0.1,shape=[192],dtype=tf.float32))
local4 = tf.nn.relu(tf.matmul(local3,weight4)+bais4)

#最后一层
weight5 = variable_with_weight_loss([192,10],std=1/192.0,w1=0)
bais5 = tf.Variable(tf.constant(0.0,shape=[10],dtype=tf.float32))
logits = tf.add(tf.matmul(local4,weight5),bais5)

训练和优化

1
2
3
4
5
6
7
8
#设置最大迭代次数
max_steps = 10000
#获取损失函数
loss = loss_func(logits,label_holder)
#设置优化算法使得成本最小
train_step = tf.train.AdamOptimizer(1e-3).minimize(loss)
#获取最高类的分类准确率,取top1作为衡量标准
top_k_op = tf.nn.in_top_k(logits,label_holder,1)

训练过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#开始训练
for step in range(max_steps):
start_time = time.time()
images_batch,labels_batch = sess.run([images_train,labels_train])
_,loss_value = sess.run([train_step,loss],feed_dict={image_holder:images_batch,
label_holder:labels_batch})
#获取计算时间
duration = time.time() - start_time
if step % 1000 == 0:
#计算每秒处理多少张图片
per_images_second = batch_size / duration
#获取时间
sec_per_batch = float(duration)
print("step:%d,duration:%.3f,per_images_second:%.2f,loss:%.3f"%(step,duration
,per_images_second,loss_value))

测试过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#计算测试集上的准确率
num_examples = 10000
import math
num_iter = int(math.ceil(num_examples / batch_size))
true_count = 0
total_sample_count = num_iter * batch_size
step = 0
while step < num_iter:
images_batch,labels_batch = sess.run([images_test,labels_test])
pred = sess.run([top_k_op],feed_dict={image_holder:images_batch,label_holder:labels_batch})
true_count += np.sum(pred)
step += 1
#计算测试集的准确率
precision = true_count / total_sample_count
print("test accuracy:%.3f"%precision)

训练结果

卷积网络 TensorFlow
Ubuntu 16.04安装Pycharm
我的小破站正式上线了
Zheng Yujie

Zheng Yujie

C++/Python/深度学习
47 日志
6 分类
29 标签
目录
  1. 1. CIFAR-10数据集简介
  2. 2. TensenFlow实现
    1. 2.1. 数据准备
    2. 2.2. 定义函数
    3. 2.3. 读取数据
    4. 2.4. 网络结构
    5. 2.5. 训练和优化
    6. 2.6. 训练过程
    7. 2.7. 测试过程
    8. 2.8. 训练结果
© 2019 Zheng Yujie | 全站共199k字
浙ICP备 - 19035016号
0%