卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer)。

使用mnist数据集,n个数据,每个数据的像素为28*28*1=784。先让这些数据通过第一个卷积层,在这个卷积上指定一个3*3*1的feature,这个feature的个数设为64。接着经过一个池化层,让这个池化层的窗口为2*2。然后在经过一个卷积层,在这个卷积上指定一个3*3*64的feature,这个featurn的个数设置为128,。接着经过一个池化层,让这个池化层的窗口为2*2。让结果经过一个全连接层,这个全连接层大小设置为1024,在经过第二个全连接层,大小设置为10,进行分类。

  1. import numpy as np
  2. import tensorflow as tf
  3. import matplotlib.pyplot as plt
  4. from tensorflow.examples.tutorials.mnist import input_data
  5. mnist = input_data.read_data_sets('data/', one_hot=True)
  6. trainimg = mnist.train.images
  7. trainlabel = mnist.train.labels
  8. testimg = mnist.test.images
  9. testlabel = mnist.test.labels
  10. print ("MNIST ready")
  1. #像素点为784
  2. n_input = 784
  3. #十分类
  4. n_output = 10
  5. #wc1,第一个卷积层参数,3*3*1,共有64个
  6. #wc2,第二个卷积层参数,3*3*64,共有128个
  7. #wd1,第一个全连接层参数,经过两个池化层被压缩到7*7
  8. #wd2,第二个全连接层参数
  9. weights = {
  10. 'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64], stddev=0.1)),
  11.  
  12. 'wc2': tf.Variable(tf.random_normal([3, 3, 64, 128], stddev=0.1)),
  13. 'wd1': tf.Variable(tf.random_normal([7*7*128, 1024], stddev=0.1)),
  14. 'wd2': tf.Variable(tf.random_normal([1024, n_output], stddev=0.1))
  15. }
  16. biases = {
  17. 'bc1': tf.Variable(tf.random_normal([64], stddev=0.1)),
  18. 'bc2': tf.Variable(tf.random_normal([128], stddev=0.1)),
  19. 'bd1': tf.Variable(tf.random_normal([1024], stddev=0.1)),
  20. 'bd2': tf.Variable(tf.random_normal([n_output], stddev=0.1))
  21. }

定义前向传播函数。先将输入数据预处理,变成tensorflow支持的四维图像;进行第一层的卷积层处理,调用conv2d函数;将卷积结果用激活函数进行处理(relu函数);将结果进行池化层处理,ksize代表窗口大小;将池化层的结果进行随机删除节点;进行第二层卷积和池化...;进行全连接层,先将数据进行reshape(此处为7*7*128);进行激活函数处理;得出结果。前向传播结束。

  1. def conv_basic(_input, _w, _b, _keepratio):
  2. # INPUT
  3. _input_r = tf.reshape(_input, shape=[-1, 28, 28, 1])
  4. # CONV LAYER 1
  5. _conv1 = tf.nn.conv2d(_input_r, _w['wc1'], strides=[1, 1, 1, 1], padding='SAME')
  6. _conv1 = tf.nn.relu(tf.nn.bias_add(_conv1, _b['bc1']))
  7. _pool1 = tf.nn.max_pool(_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  8. _pool_dr1 = tf.nn.dropout(_pool1, _keepratio)
  9. # CONV LAYER 2
  10. _conv2 = tf.nn.conv2d(_pool_dr1, _w['wc2'], strides=[1, 1, 1, 1], padding='SAME')
  11. _conv2 = tf.nn.relu(tf.nn.bias_add(_conv2, _b['bc2']))
  12. _pool2 = tf.nn.max_pool(_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
  13. _pool_dr2 = tf.nn.dropout(_pool2, _keepratio)
  14. # VECTORIZE
  15. _dense1 = tf.reshape(_pool_dr2, [-1, _w['wd1'].get_shape().as_list()[0]])
  16. # FULLY CONNECTED LAYER 1
  17. _fc1 = tf.nn.relu(tf.add(tf.matmul(_dense1, _w['wd1']), _b['bd1']))
  18. _fc_dr1 = tf.nn.dropout(_fc1, _keepratio)
  19. # FULLY CONNECTED LAYER 2
  20. _out = tf.add(tf.matmul(_fc_dr1, _w['wd2']), _b['bd2'])
  21. # RETURN
  22. out = { 'input_r': _input_r, 'conv1': _conv1, 'pool1': _pool1, 'pool1_dr1': _pool_dr1,
  23. 'conv2': _conv2, 'pool2': _pool2, 'pool_dr2': _pool_dr2, 'dense1': _dense1,
  24. 'fc1': _fc1, 'fc_dr1': _fc_dr1, 'out': _out
  25. }
  26. return out
  27. print ("CNN READY")

定义损失函数,定义优化器

  1. x = tf.placeholder(tf.float32, [None, n_input])
  2. y = tf.placeholder(tf.float32, [None, n_output])
  3. keepratio = tf.placeholder(tf.float32)
  4.  
  5. # FUNCTIONS
  6.  
  7. _pred = conv_basic(x, weights, biases, keepratio)['out']
  8. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(_pred, y))
  9. optm = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
  10. _corr = tf.equal(tf.argmax(_pred,1), tf.argmax(y,1))
  11. accr = tf.reduce_mean(tf.cast(_corr, tf.float32))
  12. init = tf.global_variables_initializer()
  13.  
  14. # SAVER
  15. save_step = 1
  16. saver = tf.train.Saver(max_to_keep=3)
  17.  
  18. print ("GRAPH READY")

进行迭代

  1. do_train = 1
  2. sess = tf.Session()
  3. sess.run(init)
  4.  
  5. training_epochs = 15
  6. batch_size = 16
  7. display_step = 1
  8. if do_train == 1:
  9. for epoch in range(training_epochs):
  10. avg_cost = 0.
  11. total_batch = int(mnist.train.num_examples/batch_size)
  12. # Loop over all batches
  13. for i in range(total_batch):
  14. batch_xs, batch_ys = mnist.train.next_batch(batch_size)
  15. # Fit training using batch data
  16. sess.run(optm, feed_dict={x: batch_xs, y: batch_ys, keepratio:0.7})
  17. # Compute average loss
  18. avg_cost += sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keepratio:1.})/total_batch
  19.  
  20. # Display logs per epoch step
  21. if epoch % display_step == 0:
  22. print ("Epoch: %03d/%03d cost: %.9f" % (epoch, training_epochs, avg_cost))
  23. train_acc = sess.run(accr, feed_dict={x: batch_xs, y: batch_ys, keepratio:1.})
  24. print (" Training accuracy: %.3f" % (train_acc))
  25. #test_acc = sess.run(accr, feed_dict={x: testimg, y: testlabel, keepratio:1.})
  26. #print (" Test accuracy: %.3f" % (test_acc))print ("OPTIMIZATION FINISHED")

tensorflow学习笔记七----------卷积神经网络的更多相关文章

  1. CNN学习笔记:卷积神经网络

    CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...

  2. 学习笔记TF027:卷积神经网络

    卷积神经网络(Convolutional Neural Network,CNN),可以解决图像识别.时间序列信息问题.深度学习之前,借助SIFT.HoG等算法提取特征,集合SVM等机器学习算法识别图像 ...

  3. 深度学习笔记 (一) 卷积神经网络基础 (Foundation of Convolutional Neural Networks)

    一.卷积 卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络.使用数层卷积,而不是数层的矩阵相乘.在图像的处理过程中,每一张图片都可以看成一张“ ...

  4. 【学习笔记】卷积神经网络 (CNN )

    前言 对于卷积神经网络(cnn)这一章不打算做数学方面深入了解,所以只是大致熟悉了一下原理和流程,了解了一些基本概念,所以只是做出了一些总结性的笔记. 感谢B站的视频 https://www.bili ...

  5. tensorflow学习之路-----卷积神经网络个人总结

    卷积神经网络大总结(个人理解) 神经网络 1.概念:从功能他们模仿真实数据 2.结构:输入层.隐藏层.输出层.其中隐藏层要有的参数:权重.偏置.激励函数.过拟合 3.功能:能通过模仿,从而学到事件 其 ...

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

    #coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tut ...

  7. Tensorflow学习笔记03-使用神经网络做线性回归

    import tensorflow as tf import numpy as np #input就是输入数据,输入矩阵,in_size就是输入矩阵的列数(数据属性数量),out_size输出矩阵列数 ...

  8. tensorflow学习笔记七----------RNN

    和神经网络不同的是,RNN中的数据批次之间是有相互联系的.输入的数据需要是要求序列化的. 1.将数据处理成序列化: 2.将一号数据传入到隐藏层进行处理,在传入到RNN中进行处理,RNN产生两个结果,一 ...

  9. Python机器学习笔记:卷积神经网络最终笔记

    这已经是我的第四篇博客学习卷积神经网络了.之前的文章分别是: 1,Keras深度学习之卷积神经网络(CNN),这是开始学习Keras,了解到CNN,其实不懂的还是有点多,当然第一次笔记主要是给自己心中 ...

随机推荐

  1. GO语言学习笔记4-int与string类型转换

    int与string类型之间相互转换可以借助strconv包里自带的函数实现. 1.string转换成int 函数原型: // base指定进制(2到36),如果base为0,则会从字符串前置判断, ...

  2. 上传200G文件

    最近遇见一个需要上传百G大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  3. (77)一文了解Redis

    为什么我们做分布式使用Redis? 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对  ...

  4. A - 地震预测

    A - 地震预测 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2 ...

  5. 使用WebStorm运行vue项目

    在WebStorm中怎么打开一个已有的项目,这个不用多说,那么如何运行一个vue项目呢? 1.点击下图中右上角的红框. 2.在出现的弹框中选中左上角“+”下的“npm”,如下图所示. 3.选中第二步的 ...

  6. RTMP服务器的延迟,多级边缘不影响延迟,gop为最大因素

    转自:http://blog.chinaunix.net/uid-26000296-id-4932826.html 编码器用FMLE,用手机秒表作为延迟计算. 结论: 1. 影响延迟的三个重要因素:网 ...

  7. centos下面配置key登录

    centos下需要配置使用key登录,并且要禁止root登录 下面的操作都是用root来设置的 1.添加新用户 例如用户名leisiyuan useradd leisiyuan 2.设置密码 pass ...

  8. LinkedList Stack

  9. leetcode-easy-array-50. Intersection of Two Arrays II

    mycode  77.78% class Solution(object): def intersect(self, nums1, nums2): """ :type n ...

  10. await Vue.nextTick() 的含义分析

    概述 今天看别人的单元测试代码的时候碰到了一段代码 await Vue.nextTick(),初看起来不是很懂,后来通过查资料弄懂了,记录下来,供以后开发时参考,相信对其他人也有用. await Vu ...