深度学习笔记北大MOOC

学习进度

第一课:前向传播、反向传播

学习内容

关键概念

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的一维数组)、数据类型

计算图

W1
W2
X1
y
X2

与上文区别:使用矩阵相乘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值进行一次传播

  1. 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随机种子如果去掉每次生成的随机数将不一致
  2. 神经网络的搭建
    即前面关键词中提到的四步
#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))

反向传播的方法

  1. 梯度下降
    随机,使参数沿着减小总损失的向移动
  train_step =tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
  1. 动量更新(改良梯度下降)保留一定原来梯度(向量和)
    多种优化方法总结
    https://blog.csdn.net/u010089444/article/details/76725843
  train_step =tf.train.Optimizer(learning_rate,momentum).minimize(loss)
  1. 自适应学习率算法
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()而非变量
参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值