TensorFlow训练模型基本步骤

一 前言

    学习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深度学习框架》

猜你喜欢

转载自blog.csdn.net/paopaovae/article/details/81143367