站浏览量 站访问人数
目录
  1. 1. 卷积的操作
  2. 2. 多层感知器
  3. 3. 卷积的实现

卷积解决重要的事情是,可以自动组织高阶特征,而不用其他辅助工具来构造高阶或衍生特征。另外,卷积的另一个贡献是,能够大量减少参数,因为卷积核可以共享参数。

卷积与视觉神经元雷同,每个神经元只处理一小块视觉图像,

卷积的操作

假设1000*1000的图片,则有100万个像素点,做全连接操作,

1
2
3
4
5
6
7
8
9
10
11
12
13

1,常规全连接
input hidden
100万个x_i 每个节点与100万个x_i连接

权重W个数=100万*100万=1万亿;

2,局部全连接

input hidden
100万个x_i 每个节点与10*10的小块block_i连接

权重W个数=(10*10)*100万=1亿;

采用卷积后,一是网络中输入特征将变少(只跟卷积核数量和卷积核大小有关),二是参数也变少(只跟卷积核数量和卷积核大小有关),

  • 图像经不同卷积核,加偏置,提取到局部特征,每个卷积核映射出新的2d图像;
  • 将新的2d图像经非线性激活,如relu;
  • 对激活后的结果进行池化,降采样,比如22–>11,最大池化即保留最显著的特征;

一个卷积层可拥有多个卷积核,如下所示:

1
2
3
4
一个卷积核    ----->     一种图片特征   ====  一个feature map
||
共享权重参数 存在多个卷积核m
n*n+1个参数 参数个数=m*(n*n+1)

同一个新2d图像的点来自同一个卷积核;参数个数只与卷积核大小(n*n)有关;卷积核足够多,就可以得到边和各种形态的点。

多层感知器

其网络的结构如下:

1
2
3
4
5
6
7
8
 x ---> w1和b1 --->w2和b2 --->output
| | | |
输入向量 nf*o1 o1*o2 o2*label
样本 第一层 第二层 输出层
特征维数nf 隐层 隐层
激活函数 激活函数 激活函数

在隐层用到的激活函数,会再引入对神经元操作的动作,如dropout、lrn等,output根据所需的目标进行激活函数选择。

具体的实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
sess = tf.InteractiveSession()

#构造网络结构
in_units = 784 #输入的特征,图像是28*28
h1_units = 300 #一层隐层大小个数
W1 = tf.Variable(tf.truncates_normal([in_units,h1_units],stddec=0.1))#第一隐层权重初始化
b1 = tf.Variable(tf.zeros[h1_units]) #第一隐层偏置
W2 = tf.Variable(tf.zeros([h1_units,10]))
b2 = tf.Variable(tf.zeros([10]))

#输入x,以及dropout的比率
x = tf.placeholder(tf.float32,[None,in_units])
keep_prop = tf.placeholder(tf.float32)

#开始建网络,前向网络,
hidden1 = tf.nn.relu( tf.matmul(x,W1)+b1 )
hidden1_drop = tf.nn.dropout(hidden1,keep_prop)
y = tf.nn.softmax(tf.matmul(hidden1_drop,W2)+b2)

#优化器

y_ = tf.placeholder(tf.float32,[None,10])
cross_entropy = tf.reduce_mean( -tf.reduce_sum( y_*tf.log(y),reduction_indices=[1] ) )
train_step = tf.train.AdagradOptimizer(0,3).minimize(cross_entropy)

#开始训练
tf.global_variables_initializer().runn()
for i in range(3000):
batch_xs,batch_ys = mnist.train.next_batch(100) #每个批次选取100个样本
train_step.run({x:batch_xs,y_:batch_ys,keep_prop:0.75}) #75%的节点保留,25%的节点置0丢弃

#结果评测
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labes,keep_prop:1.0}))

卷积的实现

参考如下代码实现