卷积网络基本概念及tensorflow代码

32人阅读 评论(0) 收藏 举报
分类:

convolutional neural networks

一、卷积神经网络的结构

A. 卷积层(Convolutional Layer)
我们知道对于给定的一幅图像来说,给定一个卷积核,卷积就是根据卷积窗口,进行像素的加权求和。深度学习中的卷积神经网络卷积核是未知的,我们训练一个神经网络,就是要训练得出这些卷积核,而这些卷积核就相当于我们学单层感知器的时候的那些参数W,因此你可以把这些待学习的卷积核看成是神经网络的训练参数W。
第一个卷积层神经元并不和输入图像的全部像素连接,只与感受野(receptive fields)内的像素连接。同样,第二卷积层中的每个神经元仅连接到位于第一卷积层中的一个小矩形内的神经元。
该体系结构允许网络将注意力集中(concentrate on)在第一个隐藏层中的低级特征上,然后将它们组装成(assemble)下一个隐藏层中的更高级别的特征。
这里写图片描述

::零值填充(zero padding)
即为了使一层具有与前一层相同的高度和宽度,可以在输入周围添加零。
例子:
这里写图片描述

给定该层位于(i,j)的神经元,连接着前一层(previous layer)行i到i + fh -1,列j到 j + fw -1范围内的神经元;这里fh 和fw是感受野的场长度和宽度。
::步长(stride)
即两个连续感受野(consecutive receptive fields)之间的距离。
例子:
我们也可以用更小的层连接前一层,一个5×7的输入层(加上zero padding)连接到一3×4层,设置stride=2, 3 × 3的感受野大小。同样,上层(i,j)处的神经元连接着前一层行i×Sh到i×Sh + fh-1,列j×Sw到j×Sw + fw-1,其中Sh和Sw是垂直和水平步长。
这里写图片描述

::滤波器(Filter or convolution kernels)
神经元的权重可以表示为感受野大小的小图像。比如权重是除中心列外,其他都是0的7×7矩阵(vertical filter)。一层中所有神经元都用相同的滤波器会得到一个特征图(feature map),特征图刻画了一张图像上相同的一类特征。
这里写图片描述

::叠加多特征图(Stacking Multiple Feature Maps)
卷积层表示为一个2维层,但实际上它是由几个大小相等的特征映射叠加组成的,因此它为3d表示。
这里写图片描述

在一个特征图(feature map)中,所有神经元共享相同的参数(weights and bias term),但不同的特征图可能有不同的参数。
一个卷积层同时将多个滤波器应用于其输入,使其能够对输入检测多个特征。
其实输入图像也由多个子层组成,三个色道(color channel):RGB。灰度图像只有一个通道,但有些图像可能有更多–例如,捕获额外光频率的卫星图像。
特别地,在给定卷积层l中,位于特征图k的(i,j)位置处的神经元与前一层l-1中的神经元的输出相连接,这些神经元位于行i×Sw到i×Sw + fw-1和列j×Sh从j×Sh + fh-1中,跨越所有特征图(在l-1层中)。需要注意,不同特征图上但位于相同位置的神经元连接完全一样的前一层神经元。
计算一卷积层上一个神经元输出的公式:
这里写图片描述
fn′ 是前一层特征图的数量。
::TensorFlow Implementation
在TensorFlow中,每个输入图像通常表示为形状[height, width, channels]的三维张量。小批量图(mini-batch)表示为形状的4d张量[mini-batch size, height, width, channels]。卷积层的权值表示为4d张量[fh, fw, fn, fn′]
代码:

import numpy as np
from sklearn.datasets import load_sample_images

#下载样本图
dataset = np.array(load_sample_images().images,dtype=np.float32)
batch_size, height, width, channels = dataset.shape

#创建2个滤波器
filter_test = np.zeros(shape=(7,7,channels,2),dtype = np.float32)
filter_test[:, 3, :, 0] = 1# 垂直线
filter_test[3, :, :, 1] = 1# 水平线

# Create a graph with input X plus a convolutional layer applying the 2 filters
X = tf.placeholder(tf.float32, shape=(None, height, width,channels))
convolution = tf.nn.conv2d(X,filter=filters,strides=[1,2,2,1],padding="SAME")

with tf.Session() as sess:
    output = sess.run(convolution, feed_dict={X: dataset})
plt.imshow(output[0, :, :, 1]) # 第一张图的第二个特征图
plt.show()

这里写图片描述

关于conv2d():
这里写图片描述

这里写图片描述

B. 池化层(Pooling Layer)
它们的目标是对输入图像进行子采样(即缩小)。
就像在卷积层中一样,池层中的每个神经元都连接到上一层中输出端的有限数量神经元,这些神经元位于一个小的矩形接受野中。必须像以前一样定义它的大小、步幅和填充类型。然而,池化层上的神经元没有权重,它所做的就是使用一个聚合函数(如最大值或平均值)来聚合输入。
这里写图片描述

池化层通常在每个输入通道(input channel)上独立工作,因此输出深度与输入深度相同。
也可以在深度维度(depth dimension)上池化,在这种情况下,图像的空间维度(高度和宽度)保持不变,但通道数量减少。
代码:

[...] # load the image dataset, just like above

# Create a graph with input X plus a max pooling layer
X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
max_pool = tf.nn.max_pool(X, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID")
with tf.Session() as sess:
output = sess.run(max_pool, feed_dict={X: dataset})
plt.imshow(output[0].astype(np.uint8)) # plot the output for the 1st image
plt.show()

这里写图片描述

C. Cnn结构(CNN Architectures)
典型的cnn架构堆叠了几个卷积层(每个层通常接一个relu层),然后是一个池层,然后是另一个卷积层(Relu),然后是另一个池层,等等。图像随着网络的叠加而变得越来越小,但由于卷积层的作用,它通常也会变得越来越深(即,有更多的特征图)。
这里写图片描述
可以看到卷特征图增大。
在顶部,添加一个常规的前馈神经网络,由几个全连接的层(Relus)组成,最后一层输出预测(例如,输出估计类概率的Softmax层)。

Tips: 一个常见的错误是使用太大的卷积核。通常可以通过将两个3×3核叠加在一起,从而获得与9×9内核相同的效果,而计算量要少得多。

参考:《Hands-On Machine Learning with
Scikit-Learn and TensorFlow》

查看评论

人工智能tensorflow

-
  • 1970年01月01日 08:00

tensorflow学习之路——实现简单的卷积网络

使用tensorflow实现一个简单的卷积神经,使用的数据集是MNIST,本节将使用两个卷积层加一个全连接层,构建一个简单有代表性的卷积网络。 代码是按照书上的敲的,第一步就是导入数据库,设置节点的...
  • shashakang
  • shashakang
  • 2018-01-07 11:59:02
  • 125

《tensorflow实战》之实现复杂的卷积网络(五)

一 基本概念 1. 正则化 L1正则化和L2正则化的定义: L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||1。 L2正则化是指权值向量w中各个元素的平方和然后再求平方...
  • qq_16540387
  • qq_16540387
  • 2018-03-17 23:08:08
  • 62

Tensorflow实战5:实现简单的卷积神经网络

1.卷积神经网络简介 卷积神经网络(convolutional neural network, CNN),最早是19世纪60年代,生物学家对猫视觉皮层研究发现:每个视觉神经元只会处理一小块区域是视觉...
  • Felaim
  • Felaim
  • 2017-03-30 15:20:58
  • 6925

TensorFlow学习(九):各种卷积网络

tensorflow的卷积网络手写体识别
  • xierhacker
  • xierhacker
  • 2017-01-02 11:34:06
  • 5940

全卷积网络 FCN 详解

1.http://www.cnblogs.com/gujianhan/p/6030639.html
  • jason123321123
  • jason123321123
  • 2017-08-31 18:33:48
  • 567

tensorflow实现LeNet-5的卷积神经网络

  • 2018年03月10日 11:31
  • 128.99MB
  • 下载

Tensorflow实战学习(二十九)【实现进阶卷积网络】

经典数据集CIFAR-10,60000张32x32彩色图像,训练集50000张,测试集10000张。标注10类,每类图片6000张。airplance、automobile、bird、cat、deer...
  • WuLex
  • WuLex
  • 2017-11-21 09:51:35
  • 219

Tensorflow实例:实现进阶的卷积神经网络

在上一篇博客,我们实现了一个简单的卷积神经网络,没有复杂的Trick。接下来,我们将使用CIFAR-10数据集进行训练。...
  • XJY104165
  • XJY104165
  • 2017-11-17 16:45:57
  • 294

TensorFlow实现卷积神经网络(进阶)

此模型中如果使用100k个batch,并结合学习速率的decay(即每隔一段时间将学习速率下降一个比率),正确率可以高达86%。模型中需要训练的参数约为100万个,而预测时需要进行的四则运算总量在20...
  • superman_xxx
  • superman_xxx
  • 2017-03-19 17:50:47
  • 3383
    个人资料
    持之以恒
    等级:
    访问量: 9679
    积分: 705
    排名: 7万+
    文章存档
    最新评论