Maxout网络

Maxout介绍

Maxout网络可以理解为单个神经元的扩展,主要是扩展单个神经元里面的激活函数。Maxout是将激活函数变成一个网络选择器,原理就是将多个神经元并列地放在一起,从它们的输出结果中找到最大的那个,代表对特征响应最敏感,然后取这个神经元的结束参与后面的运算。

下图是单个神经元和Maxout网络的区别:

Maxout的公式可以理解为:

这个的做法就是相当于同时使用多个神经元放在一起, 哪个有效果就用哪个。 所以这样的网络会有更好的拟合效果。

Maxout网络实现MNIST分类

Maxout网络的构建方法:通过reduce_max函数对多个神经元的输出来计算Max值,将Max值当作输入按照神经元正反传播方向进行计算

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/")
print ('输入数据:',mnist.train.images)
print ('输入数据打shape:',mnist.train.images.shape)
import pylab
im = mnist.train.images[1]
im = im.reshape(-1,28)
pylab.imshow(im)
pylab.show()

print ('输入数据打shape:',mnist.test.images.shape)
print ('输入数据打shape:',mnist.validation.images.shape)

import tensorflow as tf #导入tensorflow库

tf.reset_default_graph()
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data维度 28*28=784
y = tf.placeholder(tf.int32, [None]) # 0-9 数字=> 10 classes

# Set model weights
W = tf.Variable(tf.random_normal([784, 10]))
b = tf.Variable(tf.zeros([10]))

z= tf.matmul(x, W) + b
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=z))
maxout=tf.reduce_max(z,axis=1,keep_dims=True)
W2=tf.Variable(tf.truncated_normal([1,10],stddev=0.1))
b2=tf.Variable(tf.zeros([1]))
pred=tf.nn.softmax(tf.matmul(maxout,W2)+b2)
learning_rate = 0.04
# 使用梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

training_epochs = 200
batch_size = 100
display_step = 1

# 启动session
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())# Initializing OP

# 启动循环开始训练
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples/batch_size)
# 遍历全部数据集
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# Run optimization op (backprop) and cost op (to get loss value)
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
y: batch_ys})
# Compute average loss
avg_cost += c / total_batch
# 显示训练中的详细信息
if (epoch+1) % display_step == 0:
print ("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))

print( " Finished!")

Maxout的拟合功能很强大,但是也会有节点过多,参数过多,训练过慢的缺点。

----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%