利用卷积神经网络处理cifar图像分类

这是一个图像分类的比赛CIFAR( CIFAR-10 - Object Recognition in Images )

首先我们需要下载数据文件,地址:

http://www.cs.toronto.edu/~kriz/cifar.html

CIFAR-10数据集包含10个类别的60000个32x32彩色图像,每个类别6000个图像。有50000张训练图像和10000张测试图像。

数据集分为五个训练批次和一个测试批次,每个批次具有10000张图像。测试批次包含每个类别中恰好1000张随机选择的图像。训练批次按随机顺序包含其余图像,但是某些训练批次可能包含比另一类更多的图像。在它们之间,培训批次精确地包含每个班级的5000张图像。

这些类是完全互斥的。汽车和卡车之间没有重叠。“汽车”包括轿车,SUV和类似的东西。“卡车”仅包括大型卡车。都不包括皮卡车。

详细代码:

1.导包

 1 import numpy as np
 2
 3 # 序列化和反序列化
 4 import pickle
 5
 6 from sklearn.preprocessing import OneHotEncoder
 7
 8 import warnings
 9 warnings.filterwarnings(‘ignore‘)
10
11 import tensorflow as tf

2.数据加载

 1 def unpickle(file):
 2      3     with open(file, ‘rb‘) as fo:
 4         dict = pickle.load(fo, encoding=‘ISO-8859-1‘)
 5     return dict
 6
 7 # def unpickle(file):
 8 #     import pickle
 9 #     with open(file, ‘rb‘) as fo:
10 #         dict = pickle.load(fo, encoding=‘bytes‘)
11 #     return dict
12
13 labels = []
14 X_train = []
15 for i in range(1,6):
16     data = unpickle(‘./cifar-10-batches-py/data_batch_%d‘%(i))
17     labels.append(data[‘labels‘])
18     X_train.append(data[‘data‘])
19
20 # 将list类型转换为ndarray
21 y_train = np.array(labels).reshape(-1)
22 X_train = np.array(X_train)
23
24 # reshape
25 X_train = X_train.reshape(-1,3072)
26
27 # 目标值概率
28 one_hot = OneHotEncoder()
29 y_train =one_hot.fit_transform(y_train.reshape(-1,1)).toarray()
30 display(X_train.shape,y_train.shape)

3.构建神经网络

 1 X = tf.placeholder(dtype=tf.float32,shape = [None,3072])
 2 y = tf.placeholder(dtype=tf.float32,shape = [None,10])
 3 kp = tf.placeholder(dtype=tf.float32)
 4
 5 def gen_v(shape):
 6     return tf.Variable(tf.truncated_normal(shape = shape))
 7
 8 def conv(input_,filter_,b):
 9     conv = tf.nn.relu(tf.nn.conv2d(input_,filter_,strides=[1,1,1,1],padding=‘SAME‘) + b)
10     return tf.nn.max_pool(conv,[1,3,3,1],[1,2,2,1],‘SAME‘)
11
12 def net_work(input_,kp):
13
14 #     形状改变,4维
15     input_ = tf.reshape(input_,shape = [-1,32,32,3])
16 #     第一层
17     filter1 = gen_v(shape = [3,3,3,64])
18     b1 = gen_v(shape = [64])
19     conv1 = conv(input_,filter1,b1)
20 #     归一化
21     conv1 = tf.layers.batch_normalization(conv1,training=True)
22
23 #     第二层
24     filter2 = gen_v([3,3,64,128])
25     b2 = gen_v(shape = [128])
26     conv2 = conv(conv1,filter2,b2)
27     conv2 = tf.layers.batch_normalization(conv2,training=True)
28
29 #     第三层
30     filter3 = gen_v([3,3,128,256])
31     b3 = gen_v([256])
32     conv3 = conv(conv2,filter3,b3)
33     conv3 = tf.layers.batch_normalization(conv3,training=True)
34
35 #     第一层全连接层
36     dense = tf.reshape(conv3,shape = [-1,4*4*256])
37     fc1_w = gen_v(shape = [4*4*256,1024])
38     fc1_b = gen_v([1024])
39     fc1 = tf.matmul(dense,fc1_w) + fc1_b
40     fc1 = tf.layers.batch_normalization(fc1,training=True)
41     fc1 = tf.nn.relu(fc1)
42 #     fc1.shape = [-1,1024]
43
44
45 #     dropout
46     dp = tf.nn.dropout(fc1,keep_prob=kp)
47
48 #     第二层全连接层
49     fc2_w = gen_v(shape = [1024,1024])
50     fc2_b = gen_v(shape = [1024])
51     fc2 = tf.nn.relu(tf.layers.batch_normalization(tf.matmul(dp,fc2_w) + fc2_b,training=True))
52
53 #     输出层
54     out_w = gen_v(shape = [1024,10])
55     out_b = gen_v(shape = [10])
56     out = tf.matmul(fc2,out_w) + out_b
57     return out

4.损失函数准确率

 1 out = net_work(X,kp)
 2
 3 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y,logits=out))
 4
 5 # 准确率
 6 y_ = tf.nn.softmax(out)
 7
 8 # equal 相当于 ==
 9 accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y,axis = -1),tf.argmax(y_,axis = 1)),tf.float16))
10 accuracy

5.最优化

1 opt = tf.train.AdamOptimizer().minimize(loss)
2 opt

6.开启训练

 1 epoches = 50000
 2 saver = tf.train.Saver()
 3
 4 index = 0
 5 def next_batch(X,y):
 6     global index
 7     batch_X = X[index*128:(index+1)*128]
 8     batch_y = y[index*128:(index+1)*128]
 9     index+=1
10     if index == 390:
11         index = 0
12     return batch_X,batch_y
13
14 test = unpickle(‘./cifar-10-batches-py/test_batch‘)
15 y_test = test[‘labels‘]
16 y_test = np.array(y_test)
17 X_test = test[‘data‘]
18 y_test = one_hot.transform(y_test.reshape(-1,1)).toarray()
19 y_test[:10]
20
21 with tf.Session() as sess:
22     sess.run(tf.global_variables_initializer())
23     for i in range(epoches):
24         batch_X,batch_y = next_batch(X_train,y_train)
25         opt_,loss_ = sess.run([opt,loss],feed_dict = {X:batch_X,y:batch_y,kp:0.5})
26         print(‘----------------------------‘,loss_)
27         if i % 100 == 0:
28             score_test = sess.run(accuracy,feed_dict = {X:X_test,y:y_test,kp:1.0})
29             score_train = sess.run(accuracy,feed_dict = {X:batch_X,y:batch_y,kp:1.0})
30             print(‘iter count:%d。mini_batch loss:%0.4f。训练数据上的准确率:%0.4f。测试数据上准确率:%0.4f‘%
31                   (i+1,loss_,score_train,score_test))


这个准确率只达到了百分之80

如果想提高准确率,还需要进一步优化,调参

原文地址:https://www.cnblogs.com/xiuercui/p/12047336.html

时间: 2024-08-30 08:49:48

利用卷积神经网络处理cifar图像分类的相关文章

Neuromation新研究:利用卷积神经网络进行儿童骨龄评估

近日,Neuromation 团队在 Medium 上撰文介绍其最新研究成果:利用卷积神经网络(CNN)评估儿童骨龄,这一自动骨龄评估系统可以得到与放射科专家相似或更好的结果.该团队评估了手骨不同区域,发现仅对掌骨和近端指骨进行评估,得到的结果与对整个手骨进行评估的结果相差无几.为了克服放射图像的质量和多样性问题,该团队引入了严格的清理和标准化过程,以增强模型的鲁棒性和准确率,提升骨龄评估的准确率.提高结果的可复现性以及临床医生的效率. Alexander 的论文<Pediatric Bone

机器学习:利用卷积神经网络实现图像风格迁移 (一)

相信很多人都对之前大名鼎鼎的 Prisma 早有耳闻,Prisma 能够将一张普通的图像转换成各种艺术风格的图像,今天,我们将要介绍一下Prisma 这款软件背后的算法原理.就是发表于 2016 CVPR 一篇文章, " Image Style Transfer Using Convolutional Neural Networks" 算法的流程图主要如下: 总得来说,就是利用一个训练好的卷积神经网络 VGG-19,这个网络在ImageNet 上已经训练过了. 给定一张风格图像 a 和

Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_训练模型

原理就不多讲了,直接上代码,有详细注释. #coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data',one_hot=True) #每个批次的大小 batch_size = 100 n_batch = mnist.train._num_examples // batch_

利用卷积神经网络对大规模可穿戴传感器数据进行运动分类

Exercise Motion Classification from Large-scale Wearable Sensor Data Using Convolutional Neural Networks 本文使用CNN来对可穿戴传感器收集的大规模运动数据进行分类,同时对传感器数据转换为不同的图像格式输入做出了比较.最佳性能配置以92.1%的准确率将50种健身房运动分类. 作者在这里使用的是CNN而不是RNN(常用来处理时序数据),是因为每次的重复运动练习(如举哑铃)是花费的时间是非常短的少

深度卷积神经网络在目标检测中的进展

作者:travelsea链接:https://zhuanlan.zhihu.com/p/22045213来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 近些年来,深度卷积神经网络(DCNN)在图像分类和识别上取得了很显著的提高.回顾从2014到2016这两年多的时间,先后涌现出了R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD等越来越快速和准确的目标检测方法. 基于Reg

卷积神经网络(CNN)基础介绍

本文是对卷积神经网络的基础进行介绍,主要内容包含卷积神经网络概念.卷积神经网络结构.卷积神经网络求解.卷积神经网络LeNet-5结构分析.卷积神经网络注意事项. 一.卷积神经网络概念 上世纪60年代.Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念.到80年代.Fukushima在感受野概念的基础之上提出了神经认知机的概念,能够看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成很多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其

卷积神经网络(CNN)新手指南 1

http://blog.csdn.net/real_myth/article/details/52273930 卷积神经网络(CNN)新手指南 2016-07-29 18:22 Blake 1条评论 卷积神经网络(Convolutional Neural Network,CNN)新手指南 引言 卷积神经网络:听起来像是生物与数学还有少量计算机科学的奇怪结合,但是这些网络在计算机视觉领域已经造就了一些最有影响力的创新.2012年神经网络开始崭露头角,那一年Alex Krizhevskyj在Imag

斯坦福大学卷积神经网络----Module 1 Lesson 1 图像分类

原文地址:http://cs231n.github.io/classification/ 标题:Image Classification: Data-driven Approach, k-Nearest Neighbor, train/val/test splits 随手翻译,不当之处请指正 图像分类 动机:在这个部分我们会介绍图片分类问题,这是一个为输入图片从一系列分类中挑选一个合适的标签的过程.这是计算机视觉的核心问题之一,除了它看上去的简单外表之外,还有非常多的实际应用之处.除此之外,后面

跟我学算法-图像识别之图像分类(上)(基础神经网络, 卷积神经网络(CNN), AlexNet,NIN, VGG)

1.基础神经网络: 输入向量x,权重向量w, 偏置标量b, 激活函数sigmoid(增加非线性度) 优化手段: 梯度下降优化, BP向后传播(链式规则) 梯度下降优化: 1. 使用得目标函数是交叉熵  c = 1/nΣΣ[yj*lnaj^2 + (1-yj)*ln(1-aj^2)]  yj表示得是样本标签, aj表示的是输出值                            2.批量梯度下降:每次迭代一部分样本,进行参数跟新. 3. 随机梯度下降:每次迭代只选择单个样本 4. 梯度更新的方