传统神经网络存在的问题:
1.权值太多,计算量太大。
2.权值太多,需要大量样本进行训练。
局部感受野:
1962年哈佛医学院神经生理学家Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。
卷积神经网络CNN:
CNN通过感受野和权值共享减少了神经网络需要训练的参数个数。
卷积:
池化 :
对于卷积操作:
SAME PADDING: 给平面外部补0,卷积窗口采样后得到一个跟原来平面大小相同的平面。
VALID PADDING: 不会超出平面外部,卷积窗口采样后得到一个比原来平面小的平面。
对于池化操作:
SAME PADDING: 可能会给平面外部补0。
VALID PADDING: 不会超出平面外部。
假如有一个28*28的平面,用2*2并且步长为2的窗口对其进行pooling操作
使用SAME PADDING的方式,得到14*14的平面
使用VALID PADDING的方式,得到14*14的平面
假如有一个2*3的平面,用2*2并且步长为2的窗口对其进行pooling操作
使用SAME PADDING的方式,得到1*2的平面
使用VALID PADDING的方式,得到1*1的平面
CNN结构:
卷积神经网络应用于MNIST数据集分类:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("D:\BaiDu\MNIST_data",one_hot=True)
#每个批次的大小
batch_size=100
#计算一共有多少个批次
n_batch=mnist.train.num_examples//batch_size
#初始化权值
def weight_variable(shape):
initial=tf.truncated_normal(shape,stddev=0.1)#生成一个截断的正态分布
return tf.Variable(initial)
#初始化偏置
def bias_variable(shape):
initial=tf.constant(0.1,shape=shape)
return tf.Variable(initial)
#卷积层
def conv2d(x,W):
#x input tensor of shape '[batch,in_height,in_width,in_channles]'
#W filter / kernel tensor of shape [filter_height,filter_width,in_channels,out_channels]
#`strides[0] = strides[3] = 1`. strides[1]代表x方向的步长,strides[2]代表y方向的步长
#padding: A `string` from: `"SAME", "VALID"`
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')#2d的意思是二维的卷积操作
#池化层
def max_pool_2x2(x):
#ksize [1,x,y,1]
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,