zoukankan      html  css  js  c++  java
  • 深度学习笔记-----深入浅出CNN (上)

    一 为什么引入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)
    View Code

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

     

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

  • 相关阅读:
    php实现题目抢答、商品秒杀等类型的需求
    php实现批量修改文件名称
    php微信支付问题之 cURL error 60: SSL certificate: unable to get local issuer certificate
    laravel5.2之logout注销账号无效
    分布式版本控制git常见问题之gitignore冲突(精简版)
    laravel实现多数据库连接配置
    laravel实现excel表格导出
    js实现超出一定字数隐藏并用省略号"..."代替,点击后又可进行展开和收起,
    你会python不?当你听到这个问题要谨慎回答!!!
    DirectX 入门1-初识DirectX Tool Kit
  • 原文地址:https://www.cnblogs.com/NaLaEur/p/9168399.html
Copyright © 2011-2022 走看看