深度学习笔记-----深入浅出CNN (上)

时间:2022-12-03 16:20:50

深度学习笔记-----深入浅出CNN (上)

一 为什么引入CNN?

  在最初,图像处理采用的是全连接方式进行的,这样进行的缺点十分显著,假如说, 我有一张1000 * 1000像素的图片,有一个隐藏层,隐藏层共有256个节点,那么我需要一共需要多少个连接呢?  1000 * 1000 * 256 大概有2亿多个,如果我有三四个隐藏层,那么要得出计算结果,大概就需要等到几年过后了。所以说,这样就引出了CNN。


 

二  CNN有什么特点,我们引出他来解决这个问题?

  CNN 的核心思想是用了局部感受野这个概念。什么是局部感受野,通俗的来讲,人类认识事物,是由全部到局部的过程,我们通过看事物的某一部分就可以得到我们想要的结果,比如说下面这只姿势比较正常的动物:

  深度学习笔记-----深入浅出CNN (上)

  我们想判断他是一个什么动物,看他的腿,我们也许不能判断这是一个什么动物(万一是个小脑斧呢),然后只需要看他的脸部就可以确定了,这是一只猫咪,也就是说,脸部在判断中所占的权重比较大,腿部所占的权重比较小。

  同理,深度学习中的神经元也是这样的,我们没有必要让一个神经元和全部的数据有关联,只需要让他和离他比较近的一部分数据有关系就可以了。那这个如何做到的呢?当然,那就是CNN。


 

  CNN 首先用到是卷积操作,卷积操作的作用就是提取图片的特征,也就是得到feature map。卷积操作动图可以看:https://my.oschina.net/u/876354/blog/1620906

  比如说有一张1000 * 1000 像素的图像,我们采用 10 * 10 像素大小的数据为滤波器,共享权值,就可以得到了一张feature map,但是这样做就会缺失部分特征,那么我们用许多个不同的滤波器,对这张图片进行特征提取,就会得到许多feaure map,这些特征图像合并起来,就会得到原来的图像。

 

深度学习笔记-----深入浅出CNN (上)深度学习笔记-----深入浅出CNN (上)
 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)
View Code

 

 

 

  在这里,我们先显示原来的图像,然后分别使用 Vertical 矩阵和 Horizational 矩阵,得出他的横轴与纵轴的轮廓。然后发现这两个图合并后得到的结果与原图的轮廓是一致的。

 深度学习笔记-----深入浅出CNN (上)深度学习笔记-----深入浅出CNN (上)深度学习笔记-----深入浅出CNN (上)

  由此完成了CNN中提取feature map的工作,为局部感受野奠定了基础