神经网络优化

系统自动挂起之后把进程全部关了,,,之前写的都没了,这篇就省事一点吧

神经网络优化

预测酸奶日销量,y_=x1+x2,加入随机噪声(-0.05~+0.05),默认成本和利润相等:

#预测多或预测少的影响结果一样
#0导入模块,生成数据集
import tensorflow as tf
import numpy as np
BATCH_SIZE=8
SEED=23455

rdm=np.random.RandomState(SEED)
X=rdm.rand(32,2)
Y_=[[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]#rand生成[0,1](前闭后开)的随机数,除以10.0再减去0.05得到了[-0.05,0.05]之间的随机数

#1定义神经网络的输入,参数和输出,定义前向传播过程
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)

#2定义损失函数及反向传播方法。
#定义损失函数为MSE,反向传播方法为梯度下降
loss_mse=tf.reduce_mean(tf.square(y-y_))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

#3生成会话,训练STEPS轮
sess=tf.Session()
init_op=tf.global_variables_initializer()
sess.run(init_op)
STEPS=20000
for i in range(STEPS):
	start=(i*BATCH_SIZE)%32
	end=(i*BATCH_SIZE)%32+BATCH_SIZE
	sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
	if i%500==0:
		print("After %d training steps,w1 is:" %(i))
		print(sess.run(w1),"\n")
print("Final w1 is:\n",sess.run(w1))

成本1元,利润9元,模型往多了预测:

#酸奶成本1元,酸奶利润9元
#预测少了损失大,故不要预测少,生成的模型会多预测一些
#0导入模块,生成数据集
import tensorflow as tf
import numpy as np
BATCH_SIZE=8
SEED=23455
COST=1
PROFIT=9

rdm=np.random.RandomState(SEED)
X=rdm.rand(32,2)
Y_=[[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]#rand生成[0,1](前闭后开)的随机数,除以10.0再减去0.05得到了[-0.05,0.05]之间的随机数

#1定义神经网络的输入,参数和输出,定义前向传播过程
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)

#2定义损失函数及反向传播方法。
#定义损失函数使得预测少了的损失大,于是模型应该偏向多的方向预测
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*COST,(y_-y)*PROFIT))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)

#3生成会话,训练STEPS轮
sess=tf.Session()
init_op=tf.global_variables_initializer()
sess.run(init_op)
STEPS=20000
for i in range(STEPS):
	start=(i*BATCH_SIZE)%32
	end=(i*BATCH_SIZE)%32+BATCH_SIZE
	sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
	if i%500==0:
		print("After %d training steps,w1 is:" %(i))
		print(sess.run(w1),"\n")
print("Final w1 is:\n",sess.run(w1))

成本9元,利润1元,模型往少了预测:

#酸奶成本9元,酸奶利润1元
#预测多了损失大,故不要预测多,生成的模型会少预测一些
#0导入模块,生成数据集
import tensorflow as tf
import numpy as np
BATCH_SIZE=8
SEED=23455
COST=9
PROFIT=1

rdm=np.random.RandomState(SEED)
X=rdm.rand(32,2)
Y_=[[x1+x2+(rdm.rand()/10.0-0.05)] for (x1,x2) in X]#rand生成[0,1](前闭后开)的随机数,除以10.0再减去0.05得到了[-0.05,0.05]之间的随机数

#1定义神经网络的输入,参数和输出,定义前向传播过程
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)

#2定义损失函数及反向传播方法。
#定义损失函数使得预测少了的损失大,于是模型应该偏向多的方向预测
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*COST,(y_-y)*PROFIT))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)

#3生成会话,训练STEPS轮
sess=tf.Session()
init_op=tf.global_variables_initializer()
sess.run(init_op)
STEPS=20000
for i in range(STEPS):
	start=(i*BATCH_SIZE)%32
	end=(i*BATCH_SIZE)%32+BATCH_SIZE
	sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
	if i%500==0:
		print("After %d training steps,w1 is:" %(i))
		print(sess.run(w1),"\n")
print("Final w1 is:\n",sess.run(w1))

造成以上结果的原因:自定义loss值为:loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*COST,(y_-y)*PROFIT)),神经网络的目的是降低loss值,此句是判断y是否大于y_,若是,(y-y_)*COST为真,反之(y_-y)*PROFIT)为真,模型会偏向二者较小的一方预测,借此判断预测值y和标准答案y_的关系。


交叉熵(Cross Entropy):表示两个概率分布之间的距离。交叉熵越大,两个概率分布距离越远,它们的分布就越相异。

用tensorflow函数表示为:ce=-tf.reduce_mean(y_tf.log(tf.clip_by_value(y,le-12,1.0)))

                                                    神经网络优化

对y小于le-12时为le-12,大于1时为1,避免出现log 0的情况

 

softmax函数:
神经网络优化

softmax函数应用:在n分类中模型会有n个输出,即Y1,Y2,Y3......Yn,其中Yi表示第i种情况出现的可能性大小,将n个输出经过softmax函数,可得到符合概率分布的分类结果。

在Tensorflow中,一般让模型的输出经过softmax函数,以获得输出分类的概率分布,再与标准答案对比,求出交叉熵,得到损失函数,用如下函数实现:

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

cem=tf.reduce_mean(ce)


学习率learning_rate:表示了每次参数更新的幅度大小。学习率过大,会导致优化的参数在最小值附近波动,不收敛;学习率过小会导致待优化的参数收敛缓慢。  

指数衰减学习率:学习率随着训练轮数变化而动态更新

指数衰减学习率的计算公式:

神经网络优化

其中,LEARNING_RATE_STEP为学习率初始值,LEARNING_RATE_DECAY为学习率衰减率,global_step记录了当前训练轮数,为不可训练型参数。学习率learning_rate更新频率为输入数据集总样本数除以每次喂入样本数。若staircase设置为True时,表示global_step/learning rate step取整数,学习率阶梯型衰减,若staircase设置为false时,学习率会是一条平滑下降的曲线。