第四讲 神经网络优化
激活函数
1、relu,即,对应为tf.nn.relu()
2、sigmoid,即,对应为tf.nn.sigmoid()
3、tanh,即,对应为tf.nn.tanh()
损失函数
即预测值(y)与已知答案(y_)的差距。NN优化目标就是使得LOSS最小。
损失函数也有多种,有均方误差、自定义和交叉熵。
1、均方误差mse:
对应代码为loss_mse=tf.reduce_mean(tf.square(y_-y))
下面为该误差函数的应用代码:
import tensorflow as tf
import numpy as np
#0.准备
seed = 12345
BATCH_SIZE = 8
rdm = np.random.RandomState(seed)
X = rdm.rand (32,2)
Y_ = [[x1+x2+(rdm.rand()/10.0-0.05)]for (x1,x2) in X]
#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_mse = tf.reduce_mean(tf.square(y_-y))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
#3.生成会话
with tf.Session as sess:
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 trainning steps, w1 is:" % (i))
print (sess.run(w1),"\n")
print ("Final w1 is :\n", sess.run(w1))
2、自定义损失函数:
MSE的意义是,无论预测值大于或小于实际值,只有大小差异,没有正负差异。而在一些实际过程中比如预测商品销量,预测多意味着损失成本,而预测少则意味着损失利润。若利润不等于成本,则正负存在差异。用MSE不能有效描述。
因此自定义损失函数为,相应代码为loss=tf.refuce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))
3、交叉上个Cross Entropy
表征两个概率分布之间的距离。,代码为ce = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-12,1.0)))
要求n分类的n个输出通过softmax()
函数满足概率分布的要求,有,代码为ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) cem = tf.reduce_mean(ce)
网友评论