TensorFlow训练神经网络

TensorFlow训练神经网络

三个步骤

(1)定义神经网络的结构和前向传播的输出结果;

(2)定义损失函数以及选择反向传播优化的算法;

(3)生成会话并且在训练数据上反复运行反向传播优化算法。

神经网络·基本结构

神经网络由大量神经元组成。每个神经元获得线性组合的输入,经过非线性的激活函数,然后得到非线性的输出。

神经网络·激活函数

线性模型的最大特点是任意线性模型的组合仍然是线性模型,只通过线性变换,任意层的全连接神经网络 和单层神经网络没有任何区别,因此非线性是深度学习的重要特性。

目前TensorFlow提供了 7 种不同的非线性激活函数,常见的有:tf.nn.relu 、tf. sigmoid 和 tf.tanh

神经网络·softmax

用于多分类神经网络输出,公式如下:

就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。

神经网络·优化算法

神经网络模型的效果和优化的目标是通过代价函数(lost function),也称损失函数来定义的。

神经网络的优化算法可以分为两个阶段,第一阶段先通过前向传播算法计算得到预测值,计算损失函数。然后在第二阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用 梯度下降算法 更新每一个参数。

卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)由三部分构成。第一部分是输入层。第二部分由n个 卷积层池化层的组合组成。第三部分由一个全连结的多层感知机分类器构成。这一结构使得卷积神经网络天然适合处理二维特征数据

卷积神经网络·卷积层

对图像和滤波矩阵做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。卷积的主要目的是为了从输入图像中提取特征。卷积可以 通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。

卷积神经网络·池化层

池化,简言之,即取区域平均或最大,如下图所示:

池化有两种:

  • 一种是最大池化,在选中区域中找最大的值作为抽样后的值;

  • 一种是平均值池化,把选中的区域中的平均值作为抽样后的值。

卷积神经网络·Dropout

Dropout 在模型训练时按照一定的概率 暂时让网络某些隐含层节点的权重不工作(也称丢弃),作用是防止过拟合。

例如 MNIST 数字识别实例 :

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
from tensorflow.python.framework import graph_util

mnist = input_data.read_data_sets("MNIST_data", one_hot=True) # 下载并加载mnist数据
x = tf.placeholder(tf.float32, [None, 784], name='input') # 输入的数据占位符
y_ = tf.placeholder(tf.float32, shape=[None, 10]) # 输入的标签占位符

# 定义一个函数,用于初始化所有的权值 W
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)


# 定义一个函数,用于初始化所有的偏置项 b
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)


# 定义一个函数,用于构建卷积层
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')


# 定义一个函数,用于构建池化层
def max_pool(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

# 构建网络
x_image = tf.reshape(x, [-1, 28, 28, 1]) # 转换输入数据shape,以便于用于网络中
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # 第一个卷积层 g(w*x+b)
h_pool1 = max_pool(h_conv1) # 第一个池化层

W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # 第二个卷积层
h_pool2 = max_pool(h_conv2) # 第二个池化层

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64]) # reshape成向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) # 第一个全连接层

keep_prob = tf.placeholder("float",name='keep_prob')
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) # dropout层

W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2, name='y') # softmax层

cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) # 交叉熵
train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy) # 梯度下降法
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # 精确度计算


# 迭代计算
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
for i in range(40000):
batch = mnist.train.next_batch(50)
if i % 100 == 0: # 训练100次,验证一次
train_acc = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
print('step %d, training accuracy %g' % (i, train_acc))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

# 保存模型
constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def, ['input', 'keep_prob', 'y'])
with tf.gfile.FastGFile('pb/mnist.pb', mode='wb') as f:
f.write(constant_graph.SerializeToString())
sess.close()

本文标题:TensorFlow训练神经网络

文章作者:梦屿

发布时间:2020年06月02日 - 11:55:14

最后更新:2020年06月28日 - 11:49:30

原始链接:http://yexihe-jpg.github.io/2020/06/02/tensorflowlearn/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------