TensorFlow学习手册(一)——神经网络框架(解读)

这是另一个系列,是北大教授的TensorFlow笔记课程,会根据学习,对其中的一部分进行更博,希望一起学习共同进步

TensorFlow学习手册汇总:

0.python的高级用法——列表推导式,生成式

1.神经网络框架

2.网络框架优化

 

这是TensorFlow学习的第一课

这里给出一个学习神经网络的八股代码框架。

 

 

  • 代码解读

 

  • 制造数据集 X

#基于seed产生随机数
rdm = np.random.RandomState(SEED)
#随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.rand(32,2)
#从X这个32行2列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0 
#作为输入数据集的标签(正确答案) 

这里的数据集是自己瞎造的,为了学习方便,直接给了随机值

生成标签

Y_ = [[int(x0 + x1 < 1)] for (x0, x1) in X]

这段代码是生成数据集里的子步骤,主要作用是作为一个标准答案,在进行反向传播的损失值计算时和预测值进行比较。(这里是一个模拟的分类任务,称之为标签)

列表生成式的解释代码 见另一篇 python高级用法

Y_ = [[int(x0 + x1 < 1)] for (x0, x1) in X]

这一段是一段列表生成式的代码,先左边从X中取出x0,x1(这个x是个两列n行的数组),这是一个列表生成式。

然后取出来的x0和x1如果相加小于1,判断为true,int()其实是个取整数的意思,true的值就是1,这个时候Y_的值就是1了。

 

  • 定义前向传播:

x = tf.placeholder(tf.float32, shape=(None, 2))
y_= tf.placeholder(tf.float32, shape=(None, 1))

w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

这段代码是定义了前向传播的流程,分别给出了

1.输入x的一个代码定义(x0,x1输入有两个特征),输出y的一个代码定义

2.这是一个两层的神经网络,随机更新了w1(第一层参数,为方便学习这里第一层认为是1个节点,后面同理),w2(第二层参数)

3.将上述的节点穿成一个流程图,作用方法为相乘(matmul),a作为一个中转的值,y为一个输出值。

 

 

 

  • 定义反向传播:

loss_mse = tf.reduce_mean(tf.square(y-y_)) 
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

 第一行定义损失函数,第二行定义了反向传播函数,0.001为一个学习率的超参数。

 

 

 

  • 训练神经网络模型:

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)

所有的训练模型,都要在with tf.Session() as sess:下进行,第二句话为给所有权重一个初始值。第三句是更新所有参数。

STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
        if i % 500 == 0:
            total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
            print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))

定义了训练轮数为3000,并设置了batch值(一批一批的训练),所以就设置了从哪开始(start),到哪结束(end)。

给sses.run的是train_step,这个的意思是通过梯度下降的方法不断迭代,使预测值拟合标准值

 

feed_dict={x: X[start:end], y_: Y_[start:end]}

这插入的是一段字典,代码的功能就是给神经网络喂入数据。喂入的分别是X(输入数据),Y_(标准答案),(在这个小写字母为在神经网络内的参数,大写字母为数据集

 

if i % 500 == 0:
            total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
            print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))

这段代码是每隔500次,计算一下损失值,loss_mse(只用来计算,不用来执行)并打印结果。

 

 

  • 完整代码

    为方便大家实现,最后给出一个完整的代码

#coding:utf-8
#0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
SEED = 23455

#基于seed产生随机数
rdm = np.random.RandomState(SEED)
#随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.rand(32,2)
#从X这个32行2列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0 
#作为输入数据集的标签(正确答案) 
Y_ = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print "X:\n",X
print "Y_:\n",Y_

#1定义神经网络的输入、参数和输出,定义前向传播过程。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_= tf.placeholder(tf.float32, shape=(None, 1))

w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

#2定义损失函数及反向传播方法。
loss_mse = tf.reduce_mean(tf.square(y-y_)) 
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)

#3生成会话,训练STEPS轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    # 输出目前(未经训练)的参数取值。
    print "w1:\n", sess.run(w1)
    print "w2:\n", sess.run(w2)
    print "\n"
    
    # 训练模型。
    STEPS = 3000
    for i in range(STEPS):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
        if i % 500 == 0:
            total_loss = sess.run(loss_mse, feed_dict={x: X, y_: Y_})
            print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))
    
    # 输出训练后的参数取值。
    print "\n"
    print "w1:\n", sess.run(w1)
    print "w2:\n", sess.run(w2)

 

 

你可能感兴趣的:(TensorFlow)