深度学习神经网络 Tensorflow参数优化 之 损失函数

我们在前面的程序中添加测试。

#随机数返回32行2列的矩阵 表示32组 有两个特征 作为输入数据集
X = rdm.rand(32,2)
#从X这个32行2列的矩阵中取出一行,判断如果和小于1,给Y赋值1,如果和不小于1,给Y赋值0
#作为输入数据集的标签(正确答案)
Y = [[x1+x2+(rdm.rand()/10.0-0.05)] for(x1,x2)in X]
print("X:"+ str(X))
print("Y:"+str(Y))

注意这里产生的随机数一定要跟X的两个特征有关系,不然的话都是随机数训练就没有意义了。这里还加了一个噪声,显得更真实。之后我们把网络只设置为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)

即假设实际值是1,我们预测结果是1.3,则相差0.3,为0.8则相差0.2.

输出最后训练的值:

w1:[[0.98019385]
 [1.0159807 ]]

在训练中两个参数都在逼近1。是完全正确的。

我们再进行思考,若假设预测值超过和小于实际值的比重不一样应该怎么办,比如输液,目标是输入1.0,护士有次给输入了0.7,病人反应不太好,有次输入给了1.2,病人反应更不好,我们宁愿输入少点也不能输液太多。这个时候就要调整比重了。

我们考虑卖包子,成本是1,做多了1个就赔1,利润是9,少做一个就少赚9元。我们重新修改程序:

COST = 1
PROFIT = 9
#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)

这里是说,如果预测值大于实际值,损失函数是损失成本,而如果小于实际值,损失的则是利润。利润是成本的9倍。

故在计算中,我们可以看到网络的参数都在向大于1的方向靠拢,这是因为利润的比例更大。

你可能感兴趣的:(机器学习)