这是另一个系列,是北大教授的TensorFlow笔记课程,会根据学习,对其中的一部分进行更博,希望一起学习共同进步
TensorFlow学习手册汇总:
这是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)