一 为什么引入CNN?
在最初,图像处理采用的是全连接方式进行的,这样进行的缺点十分显著,假如说, 我有一张1000 * 1000像素的图片,有一个隐藏层,隐藏层共有256个节点,那么我需要一共需要多少个连接呢? 1000 * 1000 * 256 大概有2亿多个,如果我有三四个隐藏层,那么要得出计算结果,大概就需要等到几年过后了。所以说,这样就引出了CNN。
二 CNN有什么特点,我们引出他来解决这个问题?
CNN 的核心思想是用了局部感受野这个概念。什么是局部感受野,通俗的来讲,人类认识事物,是由全部到局部的过程,我们通过看事物的某一部分就可以得到我们想要的结果,比如说下面这只姿势比较正常的动物:
我们想判断他是一个什么动物,看他的腿,我们也许不能判断这是一个什么动物(万一是个小脑斧呢),然后只需要看他的脸部就可以确定了,这是一只猫咪,也就是说,脸部在判断中所占的权重比较大,腿部所占的权重比较小。
同理,深度学习中的神经元也是这样的,我们没有必要让一个神经元和全部的数据有关联,只需要让他和离他比较近的一部分数据有关系就可以了。那这个如何做到的呢?当然,那就是CNN。
CNN 首先用到是卷积操作,卷积操作的作用就是提取图片的特征,也就是得到feature map。卷积操作动图可以看:https://my.oschina.net/u/876354/blog/1620906
比如说有一张1000 * 1000 像素的图像,我们采用 10 * 10 像素大小的数据为滤波器,共享权值,就可以得到了一张feature map,但是这样做就会缺失部分特征,那么我们用许多个不同的滤波器,对这张图片进行特征提取,就会得到许多feaure map,这些特征图像合并起来,就会得到原来的图像。
1 import numpy as np 2 import tensorflow as tf 3 import matplotlib.pyplot as plt 4 import matplotlib.image as mping 5 6 image = mping.imread("paiqiu.png") 7 plt.imshow(image) 8 print (image.shape) 9 plt.show() 10 11 m, n, z = image.shape 12 13 full = np.reshape(image, [1, m, n, z]) 14 input_full = tf.Variable(tf.constant(1.0, shape=[1, m, n, z])) 15 16 filter = tf.Variable(tf.constant([1.0, 1.0, 0, 1.0, -1.0, 1.0, 17 1.0, 0, 0, 0, -1.0, 0, 18 1.0, -1.0, 0, -1.0, -1.0, -1.0, 19 1.0, 1.0, 0, 1.0, -1.0, 1.0, 20 1.0, 0, 0, 0, -1.0, 0, 21 1.0, -1.0, 0, -1.0, -1.0, -1.0, 22 1.0, 1.0, 0, 1.0, -1.0, 1.0, 23 1.0, 0, 0, 0, -1.0, 0, 24 1.0, -1.0, 0, -1.0, -1.0, -1.0], shape = [3, 3, z, 2])) 25 26 op = tf.nn.conv2d(input_full, filter, strides=[1, 1, 1, 1], padding='SAME') 27 28 29 with tf.Session() as sess: 30 sess.run(tf.global_variables_initializer()) 31 32 t, f = sess.run([op, filter], feed_dict = {input_full : full}) 33 34 t0 = t.reshape(1, m * n * 2).reshape(-1, 1) 35 Ver = [] 36 Hor = [] 37 for i in range(m * n * 2): 38 if i % 2 == 0: 39 Ver.append(t0[i]) 40 else: 41 Hor.append(t0[i]) 42 43 H = np.array (Hor) 44 V = np.array (Ver) 45 46 H = H.reshape(m, n) 47 V = V.reshape(m, n) 48 49 plt.figure(dpi = 200) 50 plt.subplot(121) 51 plt.imshow(H) 52 plt.subplot(122) 53 plt.imshow(V) 54 55 plt.imshow(V) 56 plt.imshow(H)
在这里,我们先显示原来的图像,然后分别使用 Vertical 矩阵和 Horizational 矩阵,得出他的横轴与纵轴的轮廓。然后发现这两个图合并后得到的结果与原图的轮廓是一致的。
由此完成了CNN中提取feature map的工作,为局部感受野奠定了基础