学习进度
第一课:前向传播、反向传播
学习内容
关键概念
1.张量表示数据,计算图搭建神经网络…
搭建网络属于前向传播,优化权重属于后向传播
2.神经网络传播八股
分为四步:
0.导入模块,生成数据集
1.前向传播:定义输入、参数和输出
2.反向传播:定义损失函数、反向传播方法
3.生成会话,训练STEPS轮
输入输出
import tensorflow as tf
a = tf.constant([1.0,2.0])#这部分如果写1,2的话数据类型就变了
b=tf.constant([3.0,4.0])
y = a+b
print y
#result:Tensor("add:0",shape=(2,),dytype=float32)
#分别表示名称、数组长度(长度为2的一维数组)、数据类型
计算图
与上文区别:使用矩阵相乘matmul
import tensorflow as tf
x = tf.constant([[1.0,2.0]]) #1,2 一个元素的二维特征
w = tf.constant([[3.0],[4.0]]) #2,1 两个权重
y = tf.matmul(x,w)
print y
#result:Tensor("matmul:0",shape=(1,1),dytype=float32)
#分别表示名称、数组长度(长度为1的一维数组)、数据类型
会话
with tf.Session() as sess:
print sess.run(y)
#采用上一段程序连起来得result:[11.] 1*3+2*4=11.0
前向传播
假设一个W值进行一次传播
- W值假设(神经网络参数设定方式)
例:w=tf.Variable(tf.random_normal([2,3]),stddev=2,mean=0,seed=1)
生成随机数/数组的函数:
tf.random_normal() 正态分布
tf.truncated_normal() 去掉过大偏离点的正态分布随机数
tf.random_uniform() 生成均匀分布随机数
tf.zeros 生成全0数组
tf.ones 表示生成全1数组
tf.fill 表示生成全定值数组
tf.constant 表示生成直接给定值的数组
stddev是指标准差,不同函数的指标不同,不在此一一列出
seed随机种子如果去掉每次生成的随机数将不一致 - 神经网络的搭建
即前面关键词中提到的四步
#coding:utf-8
import tensorflow as tf
#
x = tf.placeholder(tf.float32,shape = (None,2))
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)
#
with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
print"y in tf3_4.py is:/n",sess.run(y,feeed_dict={x:[[0.7,0.5],[0.2,0.3,[0.3,0.4],[0.4,0.5]]]})
placeholder函数
参数初始化
反向传播
多组w值代入,并用tf自带的优化器,以减小loss为优化目标反复训练寻找最优解
损失函数
loss_mse = tf.reduce_mean(tf.square(y_-y))
反向传播的方法
- 梯度下降
随机,使参数沿着减小总损失的向移动
train_step =tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
- 动量更新(改良梯度下降)保留一定原来梯度(向量和)
多种优化方法总结
https://blog.csdn.net/u010089444/article/details/76725843
train_step =tf.train.Optimizer(learning_rate,momentum).minimize(loss)
- 自适应学习率算法
train_step =tf.train.AdamOptimizerOptimizer(learning_rate).minimize(loss)
此处需要自己填入学习率learning_rate
借鉴一篇优化方法总结https://blog.csdn.net/u010089444/article/details/76725843
总和
0.导入模块
import,常量定义,生成数据集
1.前向传播
x,y_, w1, w2, a, y
2.反向传播
loss,train_step
3.生成会话层
with tf.Session() as sess:
Init_op=tf.global_variables_initializer()
sess,run(Init_op)
STEPS=3000
for i in range(STEPS):
start=
end=
sess.run(train_step,feed_dict:)
示例代码
工厂生产的零件,有两个特征值一个体积一个重量,如果体积和重量的和小于1,那么不合格为0,如果大于1为1
#coding:utf_8
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
seed = 23455
#基于seed产生随机数
rng = np.random.RandomState(seed)
X = rng.rand(32,2)
Y = [[int(x0+x1<1)] for (x0,x1) in X]
print "X:\n",X
print "Y:\n",Y
#前向传播
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 = 5))
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#后向传播
loss = tf.reduce_mean(tf.square(y_-y))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#会话
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS=10000
for i in range(STEPS+1):
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, feed_dict={x: X,y_: Y})
print("After %d trainsteps, loss on all date is %g" %(i,total_loss))
print"y in tf3_3.py is:\n",sess.run(y,feed_dict={x:X})
print"Y:\n",Y
拓展学习
程序中几个函数解释
tf.placeholder
placeholder,中文意思是占位符,在tensorflow中类似于函数参数,运行时必须传入值。
参考链接
tf.Variable
tf.Variable(initializer,name),参数initializer是初始化参数,name是可自定义的变量名称
v1=tf.Variable(tf.random_normal(shape=[4,3],mean=0,stddev=1),name='v1')
可生成tensor,生成序列,生成随机数,通过改变tf.random_normal,具体类型见参考链接
需要初始化,再通过sess来将数据流动起来
参考链接
sess.run
当我们构建完图后,需要在一个会话中启动图,启动的第一步是创建一个Session对象。
为了取回(Fetch)操作的输出内容,可以在使用Session对象的run()调用执行图时,传入一些tensor,这些tensor会帮助你取回结果。
在python语言中,返回的tensor是numpy ndarray对象。
在执行sess.run()时,tensorflow并不是计算了整个图,只是计算了与想要fetch的值相关的部分。
tensorflow还提供字典填充函数,使输入和输出更为简单:feed_dict = {}。
例如:需要吧8和2填充到字典中,就需要占位符tensorflow.placeholder()而非变量
参考链接