一 前言
学习TensorFLow,现对其训练神经网络模型进行下简单的总结。以简单的二分类为例。
二 代码解析
import tensorflow as tf
from numpy.random import RandomState
NumPy是一个科学计算的工具包,这里通过NumPy工具生成模拟数据集。
batch_size = 8
定义训练数据batch的大小
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
定义神经网络的参数,简单定义两个神经节点的权重。
x = tf.placeholder(tf.float32,shape=[None,2],name='x')
y_ = tf.placeholder(tf.float32,shape=[None,1],name='y_')
在shape的一个维度上使用None可以方便使用不大的batch大小,在训练时需要把数据分成较小的batch,但是在测试时可以使用全部数据。当数据集比较小时这样比较方便测试,但数据集比较大时,将大量数据导入batch可能会导致内存溢出。
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
定义神经网络前向传播的过程。
cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
定义损失函数和反向传播算法。
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size,2)
Y = [int(x1+x2 < 1) for (x1,x2) in X]
通过随机数生成一个模拟数据,定义规则来给出样本的标签。在这里x1+x2<1的样例都被认为是一个正样本,而其他为负样本。在这里使用0表示负样本,1表示正样本。
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print (sess.run(w1))
print (sess.run(w2))
创建一个会话来运行TensorFlow程序,输出w1和w2的初始值。
STEP = 5000
for i in range(STEP):
start = (i*batch_size) % dataset_size
end = min(start+batch_size,dataset_size)
# print (X[start:end])
# print (Y[start:end])
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
if i%1000 == 0:
total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print ("After %d training steps,cross_entropy on all data is %g" % (i,total_cross_entropy))
设定训练的轮数,每次选取batch_size个样本进行训练。每隔一段时间计算在所有数据上的交叉熵并输出。
可以看到经过训练,交叉熵越来越小。
初始时的w1和w2为
训练后的w1和w2为(经过优化)
三 总结
训练神经网络可分为以下三个步骤
1 定义神经网络的结构和前向传播的输出结果
2 定义损失函数以及选择后向传播的算法
3 生成会话 并且在训练数据上反复执行反向传播优化算法。
无论神经网络结构如何变化,这三个步骤基本不变。
四 参考
《TensorFlow:实战Google深度学习框架》