一、卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 [1-2]  。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” [3]  。

  二、上面说的感觉太专业化了,我们简单一点以图片为例。卷积神经网络就是通过平移的方式在一张图片上面,取一个1*1/3*3/5*5的方格。通过特征计算,得出下一个矩阵值(也就是提取后的特征图片)

  

  

  通过上面两种方式,可以看出,卷积的效果就是从一张大的图片,提取成一张小的图片。

  三、认识神经网络

  1.   感知机:
  2. n个输入数据,通过权重与各数据的之间的计算和,比较激活函数结果,得出输出。
  3. 解决分类问题
  4. 一般采用多个感知机进行分类问题的处理
  5. 神经元:
  6. 就是感知机的别名
  7. 多个神经元组成神经网络
  8. 特点:
  9. 输入向量的维度和输入神经元的个数相同
  10. 每个连接都有权重
  11. 同一层神经元之间没有连接
  12. 输入层、隐层、输出层组成
  13. N层到第N-1层所有神经元连接也叫全连接
  14. 组成:
  15. 结构、激活函数、学习规则
  16. 神经网络TensorFlowAPI模块:
  17. 1tf.nn: 提供神经网络相关操作的支持,包括卷积(conv)等
  18. 2tf.layers: 主要提供高层的神经网络,主要和卷积相关,对tf.nn的经一步封装
  19. 3tf.contrib tf.contrib.layers提供能够将计算图中的网络层、正则化、摘要操作(构建计算机图的高级操作),但是tf.contrib不稳定

  

  网站:http://playground.tensorflow.org

  四、浅层人工神经网络模型

  1.   浅层人工神经网络模型:
  2. softmax回归
  3. e^i
  4. 公式:Si = ——————
  5. je^j
  6. Si:该分类的概率, e^i:e的全连接层的分类结果值的次方,∑je^j:所有e的全连接层的分类结果值的次方
  7. 损失计算api
  8. 算法 策略 优化
  9. 线性回归 均方误差 梯度下降
  10. 逻辑回归 对数似然损失 梯度下降
  11. 神经网络 交叉熵损失 反向传播算法(梯度下降)
  12. 交叉熵损失:
  13. 公式:Hy'(y) = -∑yi'log(yi)
  14. i
  15. yi':真实结果,yi:softmax结果
  16. 衡量两者差异的一种方式
  17. 反向传播:
  18. 正向传播:输出经过一层一层计算得出结果
  19. 反向传播:从损失计算开始,梯度下降更新权重
  20. API:
  21. 特征加权:
  22. tf.matmul(<a>, <b>, <name=None>) + bias
  23. return:全连接结果,供交叉损失计算
  24. 不需要激活函数
  25. softmax计算、交叉熵
  26. tf.nn.softmax_cross_entropy_with_logits(<label=None>, <logits=None>, <name=None>)
  27. labels:标签值(真实值)
  28. logits:样本加权过后的值
  29. return:返回损失值列表
  30. 计算logits与labels之间的交叉损失熵
  31. 损失值列表平均值:
  32. tf.reduce_mean(<input_tensor>)
  33. 计算张量的尺寸的元素平均值
  34. 其他api:
  35. 损失下降(梯度下降):
  36. tf.train.GradientDescentOptimizer(<learning_rate>)
  37. learning_rate:学习率
  38. return:梯度下降OP
  39. 准确率计算:
  40. equal_list = tf.equal(<tf.argmax(y, 1)>, <tf.argmax(y_label, 1)>)
  41. accuracy = tf.reduce_mean(<tf.cast(equal_list, tf.float32)>)
  42. Mnist数据集神经网络实现流程:
  43. 1、准备数据
  44. 2、全连接计算结果
  45. 3、损失优化
  46. 4、模型评估(计算准确性)

  上面给出了一种梯度下降的方式来做损失值优化,但是实际生产中运用的是其他的优化方法比如:

  1. tf.train.GradientDescentOptimizer()
  2. tf.train.ProximalGradientDescentOptimizer()
  3. tf.train.AdagradOptimizer()
  4. tf.train.ProximalAdagradOptimizer()
  5. tf.train.AdagradDAOptimizer()
  6. tf.train.AdadeltaOptimizer()
  7. tf.train.AdamOptimizer()
  8. tf.train.RMSPropOptimizer()
  9. tf.train.FtrlOptimizer()
  10. tf.train.MomentumOptimizer()

  这里提到了一个概念叫全连接。什么叫全连接层?全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来

  

  可以看出,全连接层就是每一个节点都与上一层的节点全部连接。一般出现在预测的最后一层

  我们看一个例子

  1. # 训练,隐藏层直接是全连接层
  2. def mnist_train():
  3. # 1、准备数据(因为数据是实时传入的所以使用占位符)
  4. with tf.variable_scope("data"):
  5. x = tf.placeholder(dtype=tf.float32, shape=[None, 784], name="x")
  6. y_true = tf.placeholder(dtype=tf.float32, shape=[None, 10])
  7.  
  8. # 2、建立模型(全连接层的神经网络,这里只有一层
  9. with tf.variable_scope("model"):
  10. # 随机初始化权重和偏置
  11. w = tf.Variable(tf.random_normal([784, 10], name="weight"))
  12. b = tf.Variable(tf.constant(0.0, shape=[10]), name="bias")
  13. y_predict = tf.matmul(x, w) + b
  14.  
  15. # 3、计算损失函数
  16. with tf.variable_scope("loss"):
  17. softmax_cross = tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict)
  18. loss = tf.reduce_mean(softmax_cross)
  19.  
  20. # 4、梯度下降求出损失值
  21. with tf.variable_scope("optimizer"):
  22. train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss=loss)
  23.  
  24. # 5、计算准确率
  25. with tf.variable_scope("accuracy"):
  26. equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
  27. accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
  28.  
  29. # 收集数据
  30. tf.summary.scalar("losses", loss)
  31. tf.summary.scalar("accuracies", accuracy)
  32.  
  33. tf.summary.histogram("weight", w)
  34. tf.summary.histogram("bias", b)
  35.  
  36. merged = tf.summary.merge_all()
  37.  
  38. tf.add_to_collection("y_predict", y_predict)
  39.  
  40. # 变量初始化
  41. init_op = tf.global_variables_initializer()
  42.  
  43. # 6、会话
  44. with tf.Session() as sess:
  45. # 变量初始化
  46. sess.run(init_op)
  47.  
  48. # 准备真实数据
  49. mnist = input_data.read_data_sets("data/mnist/input_data", one_hot=True)
  50. # 将收集的数据写入文件
  51. writer = tf.summary.FileWriter("tmp/summary/mnist", graph=sess.graph)
  52. # 模型保存
  53. saver = tf.train.Saver()
  54.  
  55. # 读取端点模型
  56. if os.path.exists("model/mnist/checkpoint"):
  57. saver.restore(sess, "model/mnist/mnist")
  58. # 训练
  59. for i in range(4000):
  60. # 准备数据
  61. x_train, y_train = mnist.train.next_batch(100)
  62. # 训练
  63. sess.run(train_op, feed_dict={x: x_train, y_true: y_train})
  64. # 收集数据写入文件
  65. summary = sess.run(merged, feed_dict={x: x_train, y_true: y_train})
  66. writer.add_summary(summary, i)
  67. # 保存模型
  68. if (i + 1) % 100 == 0:
  69. saver.save(sess, "model/mnist/mnist")
  70. # 准确率
  71. print("第%d步,准确率:%f" % ((i + 1), sess.run(accuracy, feed_dict={x: x_train, y_true: y_train})))
  1. def mnist_predict():
  2. with tf.Session() as sess:
  3. # 1、加载模型
  4. saver = tf.train.import_meta_graph("model/mnist/mnist.meta")
  5. saver.restore(sess, tf.train.latest_checkpoint("model/mnist"))
  6. graph = tf.get_default_graph()
  7.  
  8. # 2、获取占位符
  9. x = graph.get_tensor_by_name("data/x:0")
  10.  
  11. # 3、获取权重和偏置
  12. y_predict = graph.get_collection("y_predict")[0]
  13.  
  14. # 4、读取测试数据
  15. mnist = input_data.read_data_sets("data/mnist/input_data", one_hot=True)
  16. # 5、预测
  17. for i in range(100):
  18. x_test, y_test = mnist.test.next_batch(1)
  19. predict = sess.run(y_predict, feed_dict={x: x_test})
  20. print("第%d个图片,预测值:%d, 真实值:%d" % ((i + 1), tf.argmax(predict, 1).eval(), tf.argmax(y_test, 1).eval()))

  注意:这里是没有进行卷积想过的,所以隐藏层只有全连接层。

  五、深层的神经网络

  1.   深层的神经网络:
  2. 深度学习网络与常见的单一隐藏层神经网络的区别在于深度
  3. 深度学习网络中,每一个节点层在前一层的输出的基础上,学习识别一组特定的特征
  4. 随着神经网络深度增加,节点所能识别的特征也越来越复杂。
  5. 卷积神经网络:
  6. 全连接层的缺点:
  7. 权重数据过多,如果图片更大,权重会个数会更大
  8. 没有利用像素之间的位置关系,对于图片来说,像素之间的关系更加紧密
  9. 层数限制
  10. 隐藏层分为:
  11. 卷积层:通常在图像上平移来提取特征
  12. 过滤器(观察窗口)大小,步长(移动的像素,一般为1
  13. 如果不越过像素,直接停止(VALID不越过边缘,取样小于边缘宽度)。
  14. 如果越过像素,进行零填充(在其他像素位置添加0)(SAME越过边缘取样,取样和输入面积一致)。
  15. 输入:H1 * W1 * D1
  16. 超参数:Filter数量KFilter大小F,步长S,零填充P
  17. 输出:
  18. H2 = (H1 - F + 2P)/S + 1
  19. W2 = (W1 - F + 2P)/S + 1
  20. D2 = K
  21. API:
  22. tf.nn.conv2d(<input>, <filter>, <strides>, <padding>, <name=None>)
  23. input: 给定的输入张量[batch, height, width, channel]
  24. filter: 指定过滤器大小[filter_height, filter_width, in_channels, out_channels]
  25. strides: 步长[1, stride, stride, 1]
  26. padding: "SAME"(越过), "VALID"(舍弃)
  27. 激活函数
  28. 增加网络的非线性分割能力
  29. 为什么实用Relu
  30. 1、采用sigmoid等函数,方向传播求误差梯度时,计算量相对较大,而采用Relu激活函数,整个过程计算量节省很多
  31. 2、对于深层网络,sigmoid函数方向传播时,很容易出现梯度爆炸的情况
  32. API
  33. tf.nn.relu(<features>, <name=None>)
  34. features: 卷积后加上偏置的结果
  35. 池化层(采样层):通过提取特征后减少学习参数,降低网络复杂度(最大化池和平均池)
  36. 主要作用就是特征提取,通过去掉Fetrue Map中不重要的样本,进一步减少参数数量。
  37. Pooling的方法很多,最常用的是MaxPooling2 * 2 步长2
  38. API:
  39. tf.nn.max_pool(<value>, <ksize>, <strides>, <padding>, <name=None>)
  40. value: 4-DTensor形状[batch, height, width, channels]
  41. ksize: 池化窗口大小[1, ksize, ksiez, 1]
  42. strides: 步长大小[1, stride, stride, 1]
  43. padding: "SAME"(越过), "VALID"(舍弃)
  44. 全连接层
  45. 前面的卷积和池化相当于做特征工程,后面的全连接层相当于特征加权。
  46. 最后的全连接层在整个卷积神经网络中起到分类器的作用。

  通过例子来说明:

  1. # 卷积神经网络
  2. def mnist_conv_train():
  3. # 1、读取真实数据
  4. mnist = input_data.read_data_sets("data/mnist/input_data", one_hot=True)
  5. # 2、生成模型
  6. x, y_true, y_predict = conv_model()
  7.  
  8. tf.add_to_collection("y_predict", y_predict)
  9.  
  10. # 3、计算损失函数
  11. with tf.variable_scope("loss"):
  12. # 计算平均交叉熵损失
  13. softmax_cross = tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict)
  14. loss = tf.reduce_mean(softmax_cross)
  15.  
  16. # 4、梯度下降求出损失值
  17. with tf.variable_scope("optimizer"):
  18. train_op = tf.train.GradientDescentOptimizer(learning_rate=0.0001).minimize(loss=loss)
  19.  
  20. # 5、计算准确率
  21. with tf.variable_scope("accuracy"):
  22. equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
  23. accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
  24.  
  25. # 6、会话训练
  26. with tf.Session() as sess:
  27. # 初始化变量
  28. sess.run(tf.global_variables_initializer())
  29.  
  30. # 模型保存
  31. saver = tf.train.Saver()
  32.  
  33. # 读取端点模型
  34. if os.path.exists("model/mnist_conv/checkpoint"):
  35. saver.restore(sess, "model/mnist_conv/mnist")
  36. # 训练
  37. for i in range(2000):
  38. # 准备数据
  39. x_train, y_train = mnist.train.next_batch(100)
  40. # 训练
  41. sess.run(train_op, feed_dict={x: x_train, y_true: y_train})
  42. # 保存模型
  43. if (i + 1) % 100 == 0:
  44. saver.save(sess, "model/mnist_conv/mnist")
  45. # 准确率
  46. print("第%d步,准确率:%f" % ((i + 1), sess.run(accuracy, feed_dict={x: x_train, y_true: y_train})))
  47.  
  48. def conv_model():
  49. # 1、建立占位符
  50. with tf.variable_scope("data"):
  51. x = tf.placeholder(dtype=tf.float32, shape=[None, 784], name="x")
  52. y_true = tf.placeholder(dtype=tf.float32, shape=[None, 10])
  53.  
  54. # 2、第一次卷积
  55. with tf.variable_scope("conv_1"):
  56. # 修改数据形状
  57. x_reshape = tf.reshape(x, shape=[-1, 28, 28, 1])
  58. # 卷积[None, 28, 28, 1] -> [None, 28, 28, 32] 32为观察者个数
  59. w_1 = gen_weight([5, 5, 1, 32])
  60. b_1 = gen_bias([32])
  61. x_conv_1 = tf.nn.conv2d(x_reshape, filter=w_1, strides=[1, 1, 1, 1], padding="SAME") + b_1
  62. # 激活
  63. x_relu_1 = tf.nn.relu(x_conv_1)
  64. # 池化[None, 28, 28, 32] -> [[None, 14, 14, 32]]
  65. x_pool_1 = tf.nn.max_pool(x_relu_1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
  66.  
  67. # 3、第二层卷积
  68. with tf.variable_scope("conv_2"):
  69. # 卷积[[None, 14, 14, 32]] -> [[None, 14, 14, 64]]
  70. w_2 = gen_weight([5, 5, 32, 64])
  71. b_2 = gen_bias([64])
  72. x_conv_2 = tf.nn.conv2d(x_pool_1, filter=w_2, strides=[1, 1, 1, 1], padding="SAME") + b_2
  73. # 激活
  74. x_relu_2 = tf.nn.relu(x_conv_2)
  75. # 池化[[None, 14, 14, 64]] -> [[None, 7, 7, 64]]
  76. x_pool_2 = tf.nn.max_pool(x_relu_2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
  77.  
  78. # 4、全连接层
  79. with tf.variable_scope("full_connection"):
  80. # 生成权重和偏置
  81. w_fc = gen_weight([7 * 7 * 64, 10])
  82. b_fc = gen_bias([10])
  83. # 修改数据形状
  84. x_fc = tf.reshape(x_pool_2, shape=[-1, 7 * 7 * 64])
  85. y_predict = tf.matmul(x_fc, w_fc) + b_fc
  86.  
  87. return x, y_true, y_predict
  88.  
  89. # 生成权重值
  90. def gen_weight(shape):
  91. return tf.Variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0, dtype=tf.float32))
  92.  
  93. # 生成偏值
  94. def gen_bias(shape):
  95. return tf.Variable(tf.constant(0.0, dtype=tf.float32, shape=shape))
  1. def mnist_conv_predict():
  2. with tf.Session() as sess:
  3. # 1、加载模型
  4. saver = tf.train.import_meta_graph("model/mnist_conv/mnist.meta")
  5. saver.restore(sess, tf.train.latest_checkpoint("model/mnist_conv"))
  6. graph = tf.get_default_graph()
  7.  
  8. # 2、获取占位符
  9. x = graph.get_tensor_by_name("data/x:0")
  10.  
  11. # 3、获取权重和偏置
  12. y_predict = graph.get_collection("y_predict")[0]
  13.  
  14. # 4、读取测试数据
  15. mnist = input_data.read_data_sets("data/mnist/input_data", one_hot=True)
  16. # 5、预测
  17. for i in range(100):
  18. x_test, y_test = mnist.test.next_batch(1)
  19. predict = sess.run(y_predict, feed_dict={x: x_test})
  20. print("第%d个图片,预测值:%d, 真实值:%d" % ((i + 1), tf.argmax(predict, 1).eval(), tf.argmax(y_test, 1).eval()))

  注意:上面的基本步骤基本没啥变化,主要变化的就是模型。这里则是做了2层卷积,但是运算量真的不小的哦。

  六、总结一下吧,这里我们都是手动的去卷积数据,需要我们自己计算卷积后的维度,还是比较麻烦的。实际生产环境中,我们一般都是针对图片数据比较大的才会使用卷积神经网络,一般都会采用别人弄好的一些卷积模型。比如  

  

  

  当然目前已经表成熟的卷积模型LeNet、AlexNet、VGGNet等,这里不做介绍了。

Python之TensorFlow的卷积神经网络-5的更多相关文章

  1. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  2. tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图

    tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...

  3. TensorFlow实现卷积神经网络

    1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...

  4. 吴裕雄 python 神经网络——TensorFlow 使用卷积神经网络训练和预测MNIST手写数据集

    import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_dat ...

  5. TensorFlow构建卷积神经网络/模型保存与加载/正则化

    TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...

  6. Tensorflow之卷积神经网络(CNN)

    前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...

  7. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

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

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

  9. 跟我学算法-tensorflow 实现卷积神经网络

    我们采用的卷积神经网络是两层卷积层,两层池化层和两层全连接层 我们使用的数据是mnist数据,数据训练集的数据是50000*28*28*1 因为是黑白照片,所以通道数是1 第一次卷积采用64个filt ...

随机推荐

  1. ES6 数组方法 forEach map filter find every some reduce

    1. forEach const colors = ['red', 'blue', 'green'] colors.forEach(function (params) { console.log(pa ...

  2. ICEM-R-b

    原视频下载地址:https://pan.baidu.com/s/1i4JGk8d ;密码: 4xr2

  3. 团队作业-Beta冲刺(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  4. python 文件夹下的图片转PDF

    from PIL import Image import os def rea(path, pdf_name): file_list = os.listdir(path) pic_name = [] ...

  5. 部分NLP工程师面试题总结

    面试题 https://www.cnblogs.com/CheeseZH/p/11927577.html 其他 大数据相关面试题 https://www.cnblogs.com/CheeseZH/p/ ...

  6. 如何在真实串口驱动还未加载的情况下调试uboot?

    1. 先找出真实串口是什么型号 1.1 怎么找?笔者提供两种方案: 方案一: 若当前的板子支持dm,从uboot的dts找串口节点对应的compatible属性 方案二: 从linux内核的dts找串 ...

  7. C#中的断言(Assert)

    重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...

  8. js写入和读取cookie

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. Tomcat中加载不到项目 项目构建Deployment Assembly报错:The given project is not a virtual component project

    转:   The given project is not a virtual component project The given project is not a virtual compone ...

  10. python读取yaml文件,在unittest中使用

    python读取yaml文件使用,有两种方式: 1.使用ddt读取 2,使用方法读取ddt的内容,在使用方法中进行调用 1.使用ddt读取 @ddt.ddt class loginTestPage(u ...