案例: 预测酸奶的日销量, 由此可以准备产量, 使得损失小(利润大),假设销量是y , 影响销量的有两个因素x1, x2, 
需要预先采集数据,每日的x1,x2和销量y_, 拟造数据集X,Y_, 假设y_=x1+x2,为了更真实加一个噪声(-0.05-0.05)

batch_size=8 #一次喂给神经网络多少数据
seed=23455
#构造数据集
rdm=np.random.RandomState(seed) #基于seed产生随机数
X=rdm.rand(32,2) #32组数据
Y_=[[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X] #rdm.rand()/10.0 是(0,1)随机数
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,1],stddev=1,seed=1))
y=tf.matmul(x,w1)
#定义损失函数 后向传播方法
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) #其他方法
#train_step=tf.train.AdamOptimizer(0.001).minimize(loss) #生成会话 训练
with tf.Session() as sess: #用会话计算结果
init_op=tf.global_variables_initializer()
sess.run(init_op)
print('w1:\n', sess.run(w1)) #输出目前(未经训练的)参数取值
#训练模型
steps=20000 #训练20000次
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]}) #8组数据
if i % 500==0: #每500轮打印一次w1值
print('After %d training steps,w1 is:' %i)
print(sess.run(w1),'\n')
print('Final w1 is:',sess.run(w1)) 结果显示 w1=[0.98,1.015] 这与Y_=x1+x2一致,预测正确!!

1.loss优化

上述例子中, loss函数是均方和, 但是实际中,预测的销量(即要准备的产量y_) 与真实的销量y 之间的差异导致的损失 取决于 生产成本cost 与销售利润profit,

当预测多了, 损失成本, 预测少了,损失利润,

所以这里要自定义loss, 上述代码不变,只需要修改下loss参数

batch_size=8 #一次喂给神经网络多少数据
seed=23455
cost=1
profit=9
#构造数据集
rdm=np.random.RandomState(seed) #基于seed产生随机数
X=rdm.rand(32,2) #32组数据
Y_=[[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X] #rdm.rand()/10.0 是(0,1)随机数
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,1],stddev=1,seed=1))
y=tf.matmul(x,w1)
#定义损失函数 后向传播方法
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),cost*(y-y_),profit*(y_-y)))
#tf.where(tf.greater(y,y_),cost*(y-y_),profit*(y_-y))第一个表示逻辑值,当为真时取第二项
#为假时取第三项
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#train_step=tf.train.MomentumOptimizer(0.001,0.9).minimize(loss) #其他方法
#train_step=tf.train.AdamOptimizer(0.001).minimize(loss) #生成会话 训练
with tf.Session() as sess: #用会话计算结果
init_op=tf.global_variables_initializer()
sess.run(init_op)
print('w1:\n', sess.run(w1)) #输出目前(未经训练的)参数取值
#训练模型
steps=20000 #训练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]}) #8组数据
if i % 500==0: #每500轮打印一次结果
print('After %d training steps,w1 is:' %i)
print(sess.run(w1),'\n')
print('Final w1 is:',sess.run(w1))

得到结果是w1=[1.02,1.04] ,系数都大于1 ,这是由于多预测的损失 少于少预测的损失,结果也往多的方向预测了.要是 cost=9 ,profit=1,

最终得到参数w1=[0.96, 0.97] 都小于1

除了均方和, 自定义loss只要, 还有第三种 交叉熵(cross entropy)的loss,

交叉熵(cross entropy): 表示两个概率分布之间的距离, ce越大,距离也就越大.

交叉熵 ce
ce=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-12,1.0)))
n个分类的n输出

ce=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
cem=tf.reduce_mean(ce)

2.learning_rate 学习率调整

设置learning_rate=0.2

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(40): #迭代40次
sess.run(train_step)
w_val=sess.run(w)
loss_val=sess.run(loss)
print('after %d steps, w is %f, loss is %f.'%(i,w_val,loss_val))

若上述learning_rate=0.001, w趋于-1速度很慢,  learning_rate=1, w会发散,不会趋于-1

上述learning_rate 不能太大,也不能太小

#学习率 决定参数的更新 learning_rate
#根据运行的轮数决定动态更新学习率
learning_rate=LEARNING_RATE_BASE*LEARNING_RATE_DECAY^(global_step/LEARNING_RATE_STEP)
#LEARNING_RATE_BASE是学习率初始值 LEARNING_RATE_DECAY是学习衰减率(0,1)
#多少轮更新一次学习率,LEARNING_RATE_STEP 一般是总样本数/batch_size
global_step=tf.Variable(0,trainable=False) #记录当前共运行了多少轮batch-size
learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,
global_step, LEARNING_RATE_STEP,
LEARNING_RATE_DECAY,
staircase=True)
# staircase true 学习率阶梯型衰减, false则为平滑下降的曲线
#根据运行的轮数决定动态更新学习率
LEARNING_RATE_BASE=0.1 #最初学习率
LEARNING_RATE_DECAY=0.9 #学习率衰减率
LEARNING_RATE_STEP=1 # 喂入多少batch_size后更新一次学习率,一般是总样本数/batch_size,这里为了方便为1 global_step=tf.Variable(0,trainable=False) #记录当前共运行了多少轮batch-size
#定义指数下降学习率
learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,
global_step, LEARNING_RATE_STEP,
LEARNING_RATE_DECAY,
staircase=True) #优化参数 ,初值5
w=tf.Variable(tf.constant(5,dtype=tf.float32))
loss=tf.square(w+1) #定义损失函数
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step) with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
for i in range(40): #迭代40次
sess.run(train_step)
learning_rate_val=sess.run(learning_rate)
global_step_val=sess.run(global_step)
w_val=sess.run(w)
loss_val=sess.run(loss)
print('after %d steps, global_step is %f,w is %f, loss is %f.' %(i,global_step_val,w_val,loss_val))

结果:

tensorflow(2):神经网络优化(loss,learning_rate)的更多相关文章

  1. tensorflow(3):神经网络优化(ema,regularization)

    1.指数滑动平均 (ema) 描述滑动平均: with tf.control_dependencies([train_step,ema_op]) 将计算滑动平均与 训练过程绑在一起运行 train_o ...

  2. Tensorflow学习:(三)神经网络优化

    一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...

  3. tensorflow:实战Google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)

    1.学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法 例如: 假设我们要最小化函数 y=x2y=x2, 选择初始点 x0=5x0=5  1. 学习率为1的时候,x在5和-5之间震荡. im ...

  4. 深度学习之TensorFlow构建神经网络层

    深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...

  5. 通过TensorFlow训练神经网络模型

    神经网络模型的训练过程其实质上就是神经网络参数的设置过程 在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图: 从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先 ...

  6. 【零基础】神经网络优化之Adam

    一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以 ...

  7. tensorflow,model,object_detection,训练loss先下降后递增,到几百万,解决tensorflow,model,object,detection,loss,incease

    现象:训练loss一开始下降一部分,跌代到若干次(具体多少和你的learning rate大小有关,大就迭代小就发生,小就需要多几次迭代) 日志如下(下面的日志来源于网络,我自己的日志已经clear掉 ...

  8. zz图像、神经网络优化利器:了解Halide

    动图示例实在太好 图像.神经网络优化利器:了解Halide  Oldpan  2019年4月17日  0条评论  1,327次阅读  3人点赞 前言 Halide是用C++作为宿主语言的一个图像处理相 ...

  9. 神经网络优化算法:梯度下降法、Momentum、RMSprop和Adam

    最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识.关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结.吴恩达的深度 ...

随机推荐

  1. NPOI 设置样式为粗体

    CellStyle style = hssfworkbook.CreateCellStyle(); Font f = hssfworkbook.CreateFont(); f.Boldweight = ...

  2. vue学习之router

    路由文档:https://router.vuejs.org/zh/guide/ 使用vue做spa应用的话,一定会涉及到路由. 安装 安装router插件 npm install vue-router ...

  3. day 8 - 1 文件操作

    文件操作 注意: 1. r+ 最为常用 2.encoding 的编码格式一定要与文件编码格式一致 读取 r  rb #在本地创建 txt 格式的文件默认使用 gbk 格式 f = open('e:/p ...

  4. 算法 - 链的操作(三) - 返回倒数第k个节点(no.23)

    输入一个链 : 1 -> 3 -> 5 -> 6 -> 8 输入 k  = 2 返回 6 这个节点 python(2.7) def getNode(head, k): if(h ...

  5. 音乐app各部分笔记(二)

    7-15播放器progress-circle圆形进度条组件实现 1.首先是引入三步  progress-circle 引入到player.vue中 然后就是 SVG技术 值得注意的事   svg 中 ...

  6. 20165231 预习作业3 linux安装及学习

    linux安装 由于以前稍微关注过虚拟机相关知识,所以大致知道虚拟机软件的相关知识.目前我已知的普遍使用的虚拟机软件是VMware Workstation(下文简称VM),VirtualBox(下文简 ...

  7. [Docker]Docker拉取,上传镜像到Harbor仓库

    需求 因为项目的需求,需要制作一个基于tomcat的镜像.那么前提就是,需要有tomcat的基础镜像. 怎么做 我的思路跑偏了,本来以为是需要将tomcat下载下来,然后通过docker命令,让它成为 ...

  8. python3-面向对象进阶(内置方法)

    面向对象进阶: isinstance和issubclass 反射 __setattr__,__getattr,__delattr__ __setitem__,__getitem,__delitem__ ...

  9. SPI总线协议及SPI时序图详解【转】

    转自:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接 ...

  10. python打印朱莉娅集合

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt # 複素数列の計算回数を出力する関数loopmax ...