import tensorflow as tf

一、张量、计算图、会话

1.张量相关性质

image.png

  1. a=tf.constant([1.0,2.0])
  2. b=tf.constant([3,4.0])
  3. result=a+b
  4. print(result)

image.png

  1. 长度为2的向量与1行2列的张量之间的区别

(1) tf.constant([1,2])
image.png
如果是两个中括弧,就是一行两列
(2) tf.constant([[1,2]])#
image.png

  1. x=tf.constant([[1,3.4]])
  2. w=tf.constant([[3.0].[4.9]])
  3. c=tf.matmul(x,w)

2.会话:

  1. with tf.Session() as sess:
  2. sess.run(c)
  1. Variable与 tensor
  • Variable的值是可以修改的,用于存放权重等,

可以使用new_state = tf.assign(state,new_tensor)

  • Tensor存放中间结果,在训练过程中不会随着参数更新而被修改

常用的生成特定类型tensor的方法

  1. tf.random_normal([2,3],stddev=2,mean=0,seed=1)#正态随机分布的随机数
  2. tf.truncated_normal()#去掉过大偏离点的正态分布
  3. tf.random_unform()#平均分布
  4. tf.zeros([2,2],tf.int32)#全0数组,常量
  5. tf.fill([3,2],6)#所有元素全是6
  6. tf.constant()
  • 如果需要查看某个张量的值,需要运行会话,使用eval( )
    1. with tf.Session() as sess:
    2. print(a.eval())
    也可以使用sess.run()来查看,他会执行相关graph中的计算,并返回与之相关的所有结果
    1. with tf.Session() as sess:
    2. sess.run(w)来查看网络中间的权重

二、 搭建神经网络

1.前向传播

  1. x=tf.placeholder(tf.float32,shape=(None,2))#使用占位符,此时x的值需要的session中确定,
  2. #并且在shape中使用None,表示可以此意喂入多组数据,但是每组数据的长度必须是2
  3. w1=tf.Variable(tf.random_normal([2,3],stddecv=1,seed=1))#权重,其初始化在session中完成
  4. w2=tf.Variable(tf.random_normal([3,1],stddev=2,seed=2))
  5. a=tf.matmul(x,w1)
  6. y=tf.matmul(a,w2)
  7. with tf.Session() as sess:
  8. init_op=tf.global_variables_initializer()
  9. sess.run(init_op)#初始化全部的参数
  10. print(sess.run(y,feed_dict={x:[[0.7,0.3],[0.23,0.4]]}))

2.反向传播

损失函数:

  1. loss=tf.reduce_mean(tf.square( y_ y ))

优化器

  1. train_step=tf.train.GradientDescenOptimizer(learining_rate).minimize(loss)
  2. train_step=tf.train.MomentumOptimizer(learning_rate,momentum).minimize(loss)
  3. train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)

完整训练过程

  1. import tensorflow as tf
  2. import numpy as np
  3. #基于seed产生随机数
  4. seed=1234
  5. rng=np.random.RandomState(seed)
  6. X=rng.rand(32,2)
  7. BATCH_SIZE=8
  8. #制作标签
  9. Y=[ [int(x0+x1<1)] for (x0,x1) in X]
  10. #网络的输入、输出以及参数和前向传播过程
  11. x=tf.placeholder(tf.float32,shape=(None,2))
  12. y_=tf.placeholder(tf.float32,shape=(None,1))
  13. w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
  14. w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
  15. a=tf.matmul(x,w1)
  16. y=tf.matmul(a,w2)
  17. loss=tf.reduce_mean(tf.square(y-y_))
  18. train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
  19. with tf.Session() as sess:
  20. init_op=tf.global_variables_initializer()
  21. sess.run(init_op)
  22. print('w1',sess.run(w1))
  23. print('w2',sess.run(w2))
  24. STEPS=3000
  25. for i in range(STEPS):
  26. start=(i*BATCH_SIZE)%32 #因为一共32个样本in 训练集合
  27. end=start+BATCH_SIZE
  28. total_loss=sess.run(loss,feed_dict={x:X,y_:Y})
  29. #sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
  30. if i%500==0:
  31. total_loss=sess.run(loss,feed_dict={x:X,y_:Y})
  32. #训练结束之后查看权重
  33. print(sess.run(w1))
  34. print(sess.run(w2))

三、loss

1、自定义给不同的损失值赋不同的权重

【例如:希望模型预测的值比真实值,尽可能地位于大于真实值的一侧
注意:可以直接使用Python内建的int类型的变量乘以tensor

  1. COST=1
  2. PROFIT=9
  3. loss=tf.reduce_sum(tf.where(tf.gather(y,y_),COST*(y-y_),(y-y_)*PROFIT))

2.交叉熵

注意:是负的,需要减号

  1. ce=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-12,1.0)))
  2. #tf.clip_by_value() 大于1.0取值为1.0,小于1e-12取值为1e-12
  3. ce=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
  4. cem=tf.reduce_mean(ce)

3. 学习率

y=(w+1)^2, 使用梯度下降,得到min(y)的时候、w的取值
注意:constant标量,是可以改变值的,使用Variable之后,可以在训练过程中随着参数跟新来改变值

  1. w=tf.Variable(tf.constant(5,dtype=tf.float32))
  2. loss=tf.square(w+1)
  3. train_step=tf.train.GradientDescentOptimizer(0.2).minimize(loss)
  4. with tf.Session() as sess:
  5. init_op=tf.global_variables_initializer()
  6. sess.run(init_op)
  7. for i in range(41):
  8. sess.run(train_step)
  9. w_val=sess.run(w)
  10. loss_val=sess.run(loss)
  11. print(w_val,loss_val)

此时经过充分的迭代,w的值已经接近-1

  • 训练过程中动态更新学习率

注意:总迭代次数,是一个不应该在训练过程中被更新的Variable;优化器的minimizer中的参数global_step

  1. LEARNING_RATE_BASE=0.1#最初的学习率
  2. LEARNING_RATE_DECAY=0.99#学习率衰减率
  3. LEARNING_RATE_STEP=1 #喂入多少轮BATCH_SIZE之后,更新一次学习率,一般设置为:总样本数量/BATCH_SIZE数量
  4. global_step=tf.Variable(0,trainable=False)#trainable False
  5. loss=tf.square(w+1)
  6. learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,gloabal_step,LEARNING_RATE_STEP,LEARNING_RATE_DECAY,staircase=True)
  7. train_step=tf.train.GradientDescentOptimizer(learning_rate).minimizer(loss,global_step=global_step)
  8. with tf.Session() as sess:
  9. for i in range(400):
  10. sess.run(train_step)
  11. learning_rate=sess.run(learining_rate)
  12. global_step_val=sess.run(global_step)
  13. loss_val=sess.run(loss)

image.png

  • global_step:比如重训练中
  • staircase

(1)True:阶梯状更新参数(当迭代次数达到LEARNING_RATE_STEP的整数倍时,会进行参数更新)
(2)False:每迭代一次就更新一次参数。平滑变化

  • LEARNING_RATE_STEP: 程序迭代多少次,更新一次学习率

滑动平均
image.png

image.png

  1. import tensorflow as tf
  2. import tensorflow as tf
  3. x=tf.placeholder(tf.float32,shape=(None,2))
  4. w1=tf.Variable(0,dtype=tf.float32)
  5. global_step=tf.Variable(0,trainable=False)
  6. MOVING_AVERAGE_DECAY=0.99
  7. ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
  8. ema_op=ema.apply(tf.trainable_variables())
  9. with tf.Session() as sess:
  10. init_op=tf.global_variables_initializer()
  11. sess.run(init_op)
  12. print(sess.run([w1,ema.average(w1)]))
  13. sess.run(tf.assign(w1,1))
  14. sess.run(ema_op)
  15. print(sess.run([w1,global_step]))
  16. sess.run(ema_op)
  17. print(sess.run([w1,global_step]))
  18. sess.run(ema_op)
  19. print(sess.run([w1,global_step]))
  20. sess.run(tf.assign(w1,10))
  21. sess.run(ema_op)
  22. print(sess.run([w1,ema.average(w1)]))
  23. print(sess.run([w1,global_step]))

正则化
image.png

  1. import temsorflow as tf
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. BATCH_SIZE=30
  5. seed=2
  6. rdm=np.random.RandomState(seed)
  7. X=rdm.randn(300,2)
  8. Y=[int(x0*x0+x1*x1<2) for (x0,x1) in X]
  9. Y_c=[['red' if y else 'blue'] for y in Y]
  10. X=np.vstack(X).reshape(-1,2)
  11. Y_=np.vstack(Y_).reshape(-1,1)