一、张量、计算图、会话
1.张量相关性质

a=tf.constant([1.0,2.0])b=tf.constant([3,4.0])result=a+bprint(result)

- 长度为2的向量与1行2列的张量之间的区别
(1) tf.constant([1,2])
如果是两个中括弧,就是一行两列
(2) tf.constant([[1,2]])#
x=tf.constant([[1,3.4]])w=tf.constant([[3.0].[4.9]])c=tf.matmul(x,w)
2.会话:
with tf.Session() as sess:sess.run(c)
- Variable与 tensor
- Variable的值是可以修改的,用于存放权重等,
可以使用new_state = tf.assign(state,new_tensor)
- Tensor存放中间结果,在训练过程中不会随着参数更新而被修改
常用的生成特定类型tensor的方法
tf.random_normal([2,3],stddev=2,mean=0,seed=1)#正态随机分布的随机数tf.truncated_normal()#去掉过大偏离点的正态分布tf.random_unform()#平均分布tf.zeros([2,2],tf.int32)#全0数组,常量tf.fill([3,2],6)#所有元素全是6tf.constant()
- 如果需要查看某个张量的值,需要运行会话,使用eval( )
也可以使用sess.run()来查看,他会执行相关graph中的计算,并返回与之相关的所有结果with tf.Session() as sess:print(a.eval())
with tf.Session() as sess:sess.run(w)来查看网络中间的权重
二、 搭建神经网络
1.前向传播
x=tf.placeholder(tf.float32,shape=(None,2))#使用占位符,此时x的值需要的session中确定,#并且在shape中使用None,表示可以此意喂入多组数据,但是每组数据的长度必须是2w1=tf.Variable(tf.random_normal([2,3],stddecv=1,seed=1))#权重,其初始化在session中完成w2=tf.Variable(tf.random_normal([3,1],stddev=2,seed=2))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(sess.run(y,feed_dict={x:[[0.7,0.3],[0.23,0.4]]}))
2.反向传播
损失函数:
loss=tf.reduce_mean(tf.square( y_ y ))
优化器
train_step=tf.train.GradientDescenOptimizer(learining_rate).minimize(loss)train_step=tf.train.MomentumOptimizer(learning_rate,momentum).minimize(loss)train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
完整训练过程
import tensorflow as tfimport numpy as np#基于seed产生随机数seed=1234rng=np.random.RandomState(seed)X=rng.rand(32,2)BATCH_SIZE=8#制作标签Y=[ [int(x0+x1<1)] for (x0,x1) in X]#网络的输入、输出以及参数和前向传播过程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)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)print('w1',sess.run(w1))print('w2',sess.run(w2))STEPS=3000for i in range(STEPS):start=(i*BATCH_SIZE)%32 #因为一共32个样本in 训练集合end=start+BATCH_SIZEtotal_loss=sess.run(loss,feed_dict={x:X,y_:Y})#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(sess.run(w1))print(sess.run(w2))
三、loss
1、自定义给不同的损失值赋不同的权重
【例如:希望模型预测的值比真实值,尽可能地位于大于真实值的一侧】
注意:可以直接使用Python内建的int类型的变量乘以tensor
COST=1PROFIT=9loss=tf.reduce_sum(tf.where(tf.gather(y,y_),COST*(y-y_),(y-y_)*PROFIT))
2.交叉熵
注意:是负的,需要减号
ce=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-12,1.0)))#tf.clip_by_value() 大于1.0取值为1.0,小于1e-12取值为1e-12ce=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))cem=tf.reduce_mean(ce)
3. 学习率
y=(w+1)^2, 使用梯度下降,得到min(y)的时候、w的取值
注意:constant标量,是可以改变值的,使用Variable之后,可以在训练过程中随着参数跟新来改变值
w=tf.Variable(tf.constant(5,dtype=tf.float32))loss=tf.square(w+1)train_step=tf.train.GradientDescentOptimizer(0.2).minimize(loss)with tf.Session() as sess:init_op=tf.global_variables_initializer()sess.run(init_op)for i in range(41):sess.run(train_step)w_val=sess.run(w)loss_val=sess.run(loss)print(w_val,loss_val)
此时经过充分的迭代,w的值已经接近-1
- 训练过程中动态更新学习率
注意:总迭代次数,是一个不应该在训练过程中被更新的Variable;优化器的minimizer中的参数global_step
LEARNING_RATE_BASE=0.1#最初的学习率LEARNING_RATE_DECAY=0.99#学习率衰减率LEARNING_RATE_STEP=1 #喂入多少轮BATCH_SIZE之后,更新一次学习率,一般设置为:总样本数量/BATCH_SIZE数量global_step=tf.Variable(0,trainable=False)#trainable 为Falseloss=tf.square(w+1)learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,gloabal_step,LEARNING_RATE_STEP,LEARNING_RATE_DECAY,staircase=True)train_step=tf.train.GradientDescentOptimizer(learning_rate).minimizer(loss,global_step=global_step)with tf.Session() as sess:for i in range(400):sess.run(train_step)learning_rate=sess.run(learining_rate)global_step_val=sess.run(global_step)loss_val=sess.run(loss)

- global_step:比如重训练中
- staircase
(1)True:阶梯状更新参数(当迭代次数达到LEARNING_RATE_STEP的整数倍时,会进行参数更新)
(2)False:每迭代一次就更新一次参数。平滑变化
- LEARNING_RATE_STEP: 程序迭代多少次,更新一次学习率
滑动平均

import tensorflow as tfimport tensorflow as tfx=tf.placeholder(tf.float32,shape=(None,2))w1=tf.Variable(0,dtype=tf.float32)global_step=tf.Variable(0,trainable=False)MOVING_AVERAGE_DECAY=0.99ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)ema_op=ema.apply(tf.trainable_variables())with tf.Session() as sess:init_op=tf.global_variables_initializer()sess.run(init_op)print(sess.run([w1,ema.average(w1)]))sess.run(tf.assign(w1,1))sess.run(ema_op)print(sess.run([w1,global_step]))sess.run(ema_op)print(sess.run([w1,global_step]))sess.run(ema_op)print(sess.run([w1,global_step]))sess.run(tf.assign(w1,10))sess.run(ema_op)print(sess.run([w1,ema.average(w1)]))print(sess.run([w1,global_step]))
正则化
import temsorflow as tfimport numpy as npimport matplotlib.pyplot as pltBATCH_SIZE=30seed=2rdm=np.random.RandomState(seed)X=rdm.randn(300,2)Y=[int(x0*x0+x1*x1<2) for (x0,x1) in X]Y_c=[['red' if y else 'blue'] for y in Y]X=np.vstack(X).reshape(-1,2)Y_=np.vstack(Y_).reshape(-1,1)
