卷积神经网络--CNN

https://easyai.tech/ai-definition/cnn/

https://www.keraschina.com/keras_cnn/

https://www.jianshu.com/p/1ea2949c0056

卷积神经网络

卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。神经网络是由一连串的神经层组成,每个神经层中存在着很多的神经元,这些神经元就是神经网络识别事物的关键。每一种神经网络都会有它的输入和输出值,当输入值是图片的时候,实际上输入神经网络的是如下图所示的数字。当神经网络需要处理这么多的数字信息的时候也就是卷积神经网络可以发挥优势的时候。

卷积就是神经网络不再对每个像素的信息做处理,而是对图片上每一小块像素区域的处理,这种做法加强了图片信息的连续性,使得神经网络能看到图形,而非一个点,这种做法同时也加深了神经网络对图片的理解。具体来说,卷积神经网络有一个批量过滤器,持续地在图片上滚动收集图片里的信息,每次收集来的信息只是一小块像素区域,然后把收集来的信息进行整理,这时候整理出来的信息有一些实际上的呈现,比如这时的神经网络能看到一些边缘的信息,然后用同样的步骤用类似批量过滤器扫过这些边缘的信息,神经网络用这些边缘信息总结出更高级的信息结构,比如这些边缘信息能画出鼻子、眼睛等等。再经过一次过滤,脸部的信息被总结出来。最后再把这些信息套入几层普通的全连接神经网络进行分类,然后就能得到输入的图片能被分为哪一类的结果。

 

CNN 的价值:

  1. 能够将大数据量的图片有效的降维成小数据量(并不影响结果)

  2. 能够保留图片的特征,类似人类的视觉原理

 

卷积神经网络的层级结构

卷积神经网络架构与常规人工神经网络架构非常相似,特别是在网络的最后一层,即全连接。此外,还注意到卷积神经网络能够接受多个特征图作为输入,而不是向量。

卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维、防止过拟合);全连接层类似传统神经网络的部分,用来输出想要的结果。

(1)数据输入层/ Input layer

该层要做的处理主要是对原始图像数据进行预处理,其中包括:

  • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。

  • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。

  • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

(2)卷积计算层/ CONV layer

这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。在这个卷积层,有两个关键操作:

  • 局部关联。每个神经元看做一个滤波器(filter)

  • 窗口(receptive field)滑动, filter对局部数据计算

先介绍卷积层遇到的几个名词:

  • 深度/depth(解释见下图):每个像素点都有一个RGB的高度

  • 步长/stride (窗口一次滑动的长度)

  • 填充值/zero-padding

卷积计算流程--详细:https://www.jianshu.com/p/1ea2949c0056

参数共享机制

  • 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。

  • 需要估算的权重个数减少: AlexNet 1亿 => 3.5w

  • 一组固定的权重和不同窗口内数据做内积: 卷积

https://zhuanlan.zhihu.com/p/36415365

(3)ReLU激励层 / ReLU layer

把卷积层输出结果做非线性映射。CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱。

激励层的实践经验:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先试RELU,因为快,但要小心点
③ 如果2失效,请用Leaky ReLU或者Maxout
④ 某些情况下tanh倒是有不错的结果,但是很少

(4)池化层 / Pooling layer

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像

这里再展开叙述池化层的具体作用。

  • 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

  • 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

  • 在一定程度上防止过拟合,更方便优化。

池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

(5)全连接层 / FC layer

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

卷积神经网络代码示例

import tensorflow.compat.v1 as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size


# 准确度
def compute_accuracy(epoch, v_xs, v_ys):

    global prediction
    y_pre = sess.run(prediction, feed_dict={xs: v_xs, keep_prob: 1.0})
    # 结果存放在一个布尔型列表中,argmax返回一维张量中最大的值所在的位置
    correct_prediction = tf.equal(tf.argmax(y_pre, 1), tf.argmax(v_ys, 1))  # y真实样本值,prediction预测值
    # 求准确率
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 1.0})

    test_acc = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 1.0})
    train_acc = sess.run(accuracy, feed_dict={xs: mnist.train.images, ys: mnist.train.labels, keep_prob: 1.0})
    print("Tter " + str(epoch) + ", Testing Accuracy " + str(test_acc) + ", Training Accuracy " + str(train_acc))

    return result



# 定义weight变量
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)


# 定义bias变量
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)


# 定义二维卷积神经网络图层
def conv2d(x, W):
    # strides[1, x_movement, y_movement, 1]
    # Must have strides[0]=strides[4]=1
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')


# 定义pooling图层
def max_pool_2x2(x):
    # strides[1, x_movement, y_movement, 1]
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')


tf.disable_v2_behavior()
# define placeholder for inputs to network
xs = tf.placeholder(tf.float32, [None, 784])  # None代表可以是任意值,行与批次有关,28*28
ys = tf.placeholder(tf.float32, [None, 10])  # 标签
keep_prob = tf.placeholder(tf.float32)  # 设备百分之多少的神经元是有效的,即0.5 50%的神经元是有效的
x_image = tf.reshape(xs, [-1, 28, 28, 1]) # 黑白,最后一位为1
# print(x_image.shape) # [n_samples,28,28,1]

# conv1 layer
W_conv1 = weight_variable([5, 5, 1, 32])  # patch 5*5 in size是image的厚度为1, out size 32
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)  # output size 28*28*32
h_pool1 = max_pool_2x2(h_conv1)  # output size 14*14*32

# conv2 layer
W_conv2 = weight_variable([5, 5, 32, 64])  # patch 5*5 in size是image的厚度为32, out size 64
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)  # output size 14*14*64
h_pool2 = max_pool_2x2(h_conv2)  # output size 7*7*64

# func1 layer  三维转化为一维
W_fc1 = weight_variable([7*7*64, 1024])
b_fc1 = bias_variable([1024])
# [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# func2 layer
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)


# the error between prediction and real data
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
                                              reduction_indices=[1])) # loss
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

with tf.Session() as sess:
    # 变量初始化
    sess.run(tf.global_variables_initializer())
    for epoch in range(21):  # 所有图片训练21次
        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys, keep_prob: 1.0})
        print(compute_accuracy(epoch, mnist.test.images, mnist.test.labels))


CNN 实际应用

https://easyai.tech/ai-definition/cnn/

(1)图像分类、检索

图像分类是比较基础的应用,他可以节省大量的人工成本,将图像进行有效的分类。对于一些特定领域的图片,分类的准确率可以达到 95%+,已经算是一个可用性很高的应用了。

典型场景:图像搜索

(2)目标定位检测

可以在图像中定位目标,并确定目标的位置及大小。

典型场景:自动驾驶、安防、医疗

(3)目标分割

简单理解就是一个像素级的分类。

他可以对前景和背景进行像素级的区分、再高级一点还可以识别出目标并且对目标进行分类。

典型场景:美图秀秀、视频后期加工、图像生成

(4)人脸识别

人脸识别已经是一个非常普及的应用了,在很多领域都有广泛的应用。

典型场景:安防、金融、生活

(5)骨骼识别

骨骼识别是可以识别身体的关键骨骼,以及追踪骨骼的动作。

典型场景:安防、电影、图像视频生成、游戏

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值