简单图像分类与识别CNN,Tensorflow,Cifar10(吴恩达Deep Learning)

来源:互联网 发布:mac梦幻西游怎么卸载 编辑:程序博客网 时间:2024/06/16 01:08

简介

因最近在学习深度学习,看了网易云课堂吴恩达的深度学习工程师和李宏毅的机器学习的课程,对卷积神经网络还是不是很理解。自己在网上搜教程,深度学习的入门程序《MNIST手写数字识别》,照着写了一遍跑了一遍。于是在网上下载了cifar数据集, 随便搭建了一个卷积神经网络, 仅供娱乐, 不追求过高表现, 展示一遍学习深度学习的心路历程,优点是及其简单,比tensorflow官方给出的cifar10识别代码简单。

CIFAR数据集

Cifar10数据集下载链接,找到python版本的下载即可,大小170M左右。
简要介绍该数据集:

  • 50000张训练集图片,10000张测试集图片
  • 每张图片为32*32*3 = 3072个像素值,32*32、32*32、32*32位RGB不同通道
  • 文件解压后有5个data_batch和1个test_batch,每个有1万张数据,如下图:
    这里写图片描述

卷积神经网络(LeNet-5)

网上视频+论文+其它教程,自行去了解观看,我自己按照LeNet-5结构随便随性搭的CNN,未使用太多优化,也未考虑效率或者其它问题。大致思路是输入、卷积、池化、再卷积、再池化、拉伸、接入全连接网络、输出、训练。

代码

代码简洁清晰,因博主也没用过多久python,简单勿嫌弃。

import tensorflow as tfimport numpy, pickle# import matplotlib.pyplot as plt# 1.处理输入# cifar10中训练batch存储格式为字典,其中# data:10000个32*32*3图像,labels:0-9数字表示10个类别,filenames:10000个图像名称,batch_label为batch序号# 输出为X(10000, 3072), Y(10000, 10)def load_cifar_10_data_batch(filename):    file = open(filename, 'rb')    datadictionary = pickle.load(file, encoding='latin1')    X = datadictionary['data'] # X.shape = (1000, 3072)    Y = datadictionary['labels']    # filenames = datadictionary['filenames']    # batch_label = datadictionary['batch_label']    # X = X.reshape(10000, 3, 32, 32).transpose(0, 2 ,3 ,1).astype('float')    Y_temp = numpy.array(Y)    return X, Ypath = '/home/wanglei/wl/vscode/deeplearning'X_train, Y_train = load_cifar_10_data_batch(path + '/cifar-10-batches-py/data_batch_1')X_test, Y_test = load_cifar_10_data_batch(path + '/cifar-10-batches-py/test_batch')# 2.构造网络所需的函数# 2.1 参数w初始化, tf.random_normal为根据shape产生随机分布,均值标准差自定, shape=[height, width, channels, filters]def weights(shape):    return tf.Variable(tf.random_normal(shape=shape, mean=0, stddev=0.1))# 2.2 参数b初始化, tf.constant为根据shape产生常量def biases(shape):    return tf.Variable(tf.constant(0.1, shape=shape))# 2.3 卷积函数, x=[m, height, width, channels], m为待训练集数量def conv2d(x, W):    return tf.nn.conv2d(input=x, filter=W, strides=[1,1,1,1], padding='SAME', use_cudnn_on_gpu=True)# 2.4 池化函数, 池化其实也相当于一次卷积, 比较特殊的卷积def max_pool(x):    return tf.nn.max_pool(value=x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')# 2.5 计算准确率, 根据测试集def compute_accuracy(x_test, y_test):    global predict_function    predict_test = sess.run(predict_function, feed_dict={xs:x_test})    # 比较预测值与测试集最大值下标是否相同, 返回相同个数    y_test_one_hot = tf.one_hot(y_test, depth = 10)    correct_num = tf.equal(tf.argmax(predict_test, 1), tf.argmax(y_test_one_hot, 1))    # 计算均值即为精确率, 并转格式float32    accuracy = tf.reduce_mean(tf.cast(correct_num, tf.float32))    return sess.run(accuracy, feed_dict={xs:x_test, ys:y_test})# 3.定义输入, xs为训练集输入m*3072矩阵, ys为训练集labelsm*1矩阵xs = tf.placeholder(tf.float32, [None, 32*32*3])/255ys = tf.placeholder(tf.int32, [None])# 4. 构造网络# x0为输入m*32*32*3, 图像数量m, 大小32*32, channels为3x0 = tf.transpose(tf.reshape(xs, [-1, 3, 32, 32]), perm=[0, 2, 3, 1])# 4.1 构建卷积层, 卷积、池化、再卷积、再池化、最后拉伸W_conv1 = weights([5, 5, 3, 20])b_conv1 = biases([20])a_conv1 = conv2d(x0, W_conv1) + b_conv1z_conv1 = tf.nn.relu(a_conv1)h_conv1 = max_pool(z_conv1)W_conv2 = weights([5, 5, 20, 50])b_conv2 = biases([50])a_conv2 = conv2d(h_conv1, W_conv2) + b_conv2z_conv2 = tf.nn.relu(a_conv2)h_conv2 = max_pool(z_conv2)# x_conv0为卷积池化后拉伸的输入m*(8*8*35=2240), 图像数量m, 输入为2240x_conv0 = tf.reshape(h_conv2, [-1, 8*8*50])# 4.2 接入fully connected networks, 网络各层单元数为2240, 1024, 10W_fc1 = weights([8*8*50, 1024])b_fc1 = biases([1024])a_fc1 = tf.matmul(x_conv0, W_fc1) + b_fc1z_fc1 = tf.nn.sigmoid(a_fc1)W_fc2 = weights([1024, 10])b_fc2 = biases([10])a_fc2 = tf.matmul(z_fc1, W_fc2) + b_fc2# z_fc2 = tf.nn.relu(a_fc2)# 4.3 预测函数与代价函数, 采用最简单的predict_function = a_fc2ys_one_hot = tf.one_hot(ys, depth = 10)# cost_function = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(predict_function), reduction_indices=[1]))cost_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys_one_hot, logits=predict_function))# 4.4 梯度下降, 使cost_function值最小train_step = tf.train.GradientDescentOptimizer(1e-4).minimize(cost_function)# train_step = tf.train.AdamOptimizer(1e-3).minimize(cost_function)# 5. 训练并图像化表示sess = tf.Session()sess.run(tf.global_variables_initializer())saver = tf.train.Saver()for i in range(20):    for t in range(0, 10000-32, 32):        iter = t // 32        xs_batch, ys_batch = X_train[t:t+32], Y_train[t:t+32]        sess.run(train_step, feed_dict={xs:xs_batch, ys:ys_batch})        if iter % 10 == 0:            cost = sess.run(cost_function, feed_dict={xs: xs_batch, ys: ys_batch})            accuracy = compute_accuracy(X_test[:10000], Y_test[:10000])            print("iters:%s, cost:%s, accuracy:%s" % (iter, cost, accuracy))# saver.save(sess, '/Users/wanglei/Downloads/test/model.ckpt')sess.close()

实验结果

这里写图片描述
因自己的破电脑原因,用了1000个训练集都TM很慢,效果当然不是很好,精确率10%(残缺),MMP,跑了几个小时还没跑完。实验室一同学替我跑了下,10000个训练集差不多达到27%左右精确率,50000个训练完,达到68.9%精确率。

总结

不是为了展现多优美的模型,多高深的架构或者多好的表现。仅仅是为了学习卷积神经网络,而且是让我能简单的学习,麻雀虽小,五脏俱全,不想思考太深的网络,由浅入深、登堂入室才是王道。如果是为了追求极高的准确率,可以去tensorflow官网下关于cifar10的源代码,然后研读,再研究出更好的,调参优化等等。嗯,这是博主关于cnn的第二个自己练手的例子。

深度学习心路历程

  • 看视频,从吴恩达的Machine Learning到Deep Learning, 穿插着李宏毅的机器学习
  • 编程,跟着网上视频课程做作业和网上找教程案例,吴恩达的机器学习课的作业挺不错,简单便于理解。
  • 看论文,然而了了,进度太慢,需要耐心。
    我最开始从开视频开始,看了好久,然后苦于没有任何思路去练习,最后找了一个框架tensorflow进行简单的学习,MNIST手写数字,然后再找到cifar10数据集进行简单的识别分类。由简入深,慢慢来。
阅读全文
0 0