Tensorflow 笔记: 神经网络优化-损失函数

 √ 神经元模型: 用数学公式表示为: 𝐟(∑xw +b), , f  为激活函数。 神经网络 是 以神经元为基本单元构成的.
√ 激活函数: 引入 非线性 激 活因素,提升模型表达力git

经常使用的激活 函数有  relu 、 sigmoid 、 tanh  等。网络

 激活函数  relu: : 在  tensorflow  中, 用  tf.nn.relu()dom

 

激活函数 激活函数  sigmoid :在  Tensorflow  中,用  tf.nn.sigmoid() 表示函数

 

激活函数 激活函数  tanh :在 Tensorflow  中,用  tf.nn.tanh()优化

    

 

 

神经网络的复杂度:可用神经网络的层数和神经网络中待优化参数个数表示
√ 神经网路的 层数:通常不计入输入层,层数  = n 个隐藏层 + 1 个输出层
√ 神经网路待优化的 参数:神经网络中全部参数  w 的个数 + 全部参数b 的个数spa

损失函数( loss): 用来表示预测值( y)与已知答案( y_)的差距。 在训练神经网络时,经过不断
改变神经网络中全部参数,使损失函数不断减少,从而训练出更高准确率的神经网络模型。code

√ 经常使用的 损失函数有均方偏差、自定义和交叉熵 等orm

 √ 均方偏差  mse : n  个样本的 预测值  y 与已知 答案  y_之差的 平方和,再求平均值。blog

在 Tensorflow  中用  loss_mse = tf.reduce_mean(tf.square(y_ - y))ip

 

# coding:utf-8
# 0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
SEED = 23455

# 基于seed产生随机数
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y_ = [[x1 + x2 +(rdm.rand()/10.0-0.05)] for (x1, x2) in X]

print(X)
print(Y_)

# 1定义神经网络的输入、参数和输出,定义前向传播过程。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))

w = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))

y = tf.matmul(x, w)

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

# 3生成会话,训练STEPS轮
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 training step(s)" % (i))
print("w1:\n", sess.run(w))

# 输出训练后的参数取值。
print("\n")
print("w1:\n", sess.run(w))

√ 自定义损失函数:根据 问题的实际状况,定制 合理的损失函数 。
例如:
对于预测酸奶日销量问题,若是预测销量大于实际销量则会损失成本;若是预测销量小于实际销量则
会损失利润。在实际生活中,每每制造一盒酸奶的成本和销售一盒酸奶的利润是不等价的。所以,需
要使用符合该问题的自定义损失函数。
自定义损失函数为: loss = ∑ 𝑛 𝑓(y_,y)
其中,损失定义成分段函数:
f(y_,y) = { 𝑄𝑆𝑃𝐹𝐼𝑈 ∗ (𝑦_ − 𝑦) 𝑦 < 𝑦_
𝐶𝑃𝑇𝑈 ∗ (𝑦 − 𝑦_) 𝑦 >= 𝑦_
损失函数表示,若预测结果 y 小于标准答案 y_,损失函数为利润乘以预测结果 y 与标准答案 y_之差;
若预测结果 y 大于标准答案 y_,损失函数为成本乘以预测结果 y 与标准答案 y_之差。
用 Tensorflow 函数表示为:
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))
① 若酸奶成本为 1 元,酸奶销售利润为 9 元,则制形成本小于酸奶利润,所以但愿预测的结果 y 多
一些。采用上述的自定义损失函数,训练神经网络模型。

 

# coding:utf-8
# 0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
SEED = 23455
COST=1
PROFIT=9

# 基于seed产生随机数
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y_ = [[x1 + x2 +(rdm.rand()/10.0-0.05)] for (x1, x2) in X]

print(X)
print(Y_)

# 1定义神经网络的输入、参数和输出,定义前向传播过程。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))

w = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))

y = tf.matmul(x, w)

# 2定义损失函数及反向传播方法。
loss_mse = tf.reduce_sum(tf.where(tf.greater(y,y_),COST*(y-y_),PROFIT*(y_-y)))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

# 3生成会话,训练STEPS轮
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)

# 训练模型。
STEPS = 3000
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 step(s)" % (i))
print("w1:\n", sess.run(w))

# 输出训练后的参数取值。
print("\n")
print("w1:\n", sess.run(w))

√ 交叉熵(Cross Entropy): : 表示 两个几率分布之间的距离。交叉熵越大,两个几率分布 距离 越远, 两个几率分布越 相异 ; 交叉熵越小,两个几率分布 距离 越近 ,两个几率分布越类似。 。交叉熵计算公式: :𝐇(𝐳_ , 𝐳) = −∑𝐳_ ∗ 𝒍𝒑𝒈 𝒛用 用 T Tw ensorflow 函数表示 为ce= - - tf.reduce_mean(y_* tf.log(tf.clip_by_value(y, 1e- - 12, 1.0)))例如:两个神经网络模型解决二分类问题中,已知标准答案为 y_ = (1, 0),第一个神经网络模型预测结果为7y1=(0.6, 0.4),第二个神经网络模型预测结果为 y2=(0.8, 0.2),判断哪一个神经网络模型预测的结果更接近标准答案。根据交叉熵的计算公式得:H1((1,0),(0.6,0.4)) = -(1*log0.6 + 0*log0.4) ≈ -(-0.222 + 0) = 0.222H2((1,0),(0.8,0.2)) = -(1*log0.8 + 0*log0.2) ≈ -(-0.097 + 0) = 0.097因为 0.222>0.097,因此预测结果 y2 与标准答案 y_更接近,y2 预测更准确。√ √softmax 函数 :将 将 n 分类的 n 个输出( (y1,y2…yn) ) 变 为 知足如下几率分布要求的函数。 。softmax 函数应用:在 n 分类中,模型会有 n 个输出,即 y1,y2…yn,其中 yi 表示第 i 种状况出现的可能性大小。将 n 个输出通过 softmax 函数,可获得符合几率分布的分类结果。√在 在 Tensorflow 中,通常让 模型 的过 输出通过 sofemax 函数 , 以 得到输出分类的 几率分布,再与标准答案 对比, 求 出 交叉熵 , 获得损失函数,用以下函数 实现: :ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))cem = tf.reduce_mean(ce)

相关文章
相关标签/搜索