深层神经网络主要有两个特征:**多层(显然)**和非线性,其优化的目标是由损失函数来定义的
1.非线性变换
由激活函数实现
常用函数:ReLU,sigmoid,tanh函数
2.损失函数
分类问题常用:
交叉熵:给定两个概率分布p和q,用q来表示p的交叉熵:
H
(
p
,
q
)
=
−
Σ
p
(
x
)
l
o
g
q
(
x
)
H(p,q) = -\varSigma p(x)log q(x)
H(p,q)=−Σp(x)logq(x)
用来判断预测答案和真实答案间的距离
预测答案:经过非线性变换后的值,即神经网络的输出
真实答案:最终输出层的结果
cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y, 1e-10,1.0))
+(1-y_) * tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
#使用softmax回归处理后的交叉熵
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(
labels=y_,logits=y)
未加入前各个函数用法实例如下:
import tensorflow as tf
input1 = tf.constant([[1.0, 2.0, 3.0],[4.0,5.0,6.0]])
input2 = tf.Variable(tf.random_normal([2,3], name="input2"))
with tf.Session() as sess:
tf.global_variables_initializer
print(tf.clip_by_value(input1,2.0,5.0).eval())
print((tf.log(input1).eval()))
print((input1*input2).eval())
print(tf.reduce_mean(input1).eval())
输出:
[[2. 2. 3.]
[4. 5. 5.]]
[[0. 0.6931472 1.0986123]
[1.3862944 1.609438 1.7917595]]
回归问题常用:
均方误差MSE
M
S
E
(
y
,
y
′
)
=
∑
i
=
1
n
(
y
i
−
y
′
)
n
MSE(y,y')=\cfrac{\displaystyle\sum_{i=1}^n(y~i~-y')}{n}
MSE(y,y′)=ni=1∑n(y i −y′)
yi为一个batch中第i个数据的正确答案
y为神经网络给出的预测值
下面是实现:
mse = tf.reduce_mean(tf.square(y_ - y))
2.1
自定义损失函数
以计算商品利润问题为例,当预测值大于真实值,亏损1*(y-y_)元;当预测值小于真实值亏损10*(y_-y)元)。
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), loss_more*(y-y_), loss_less*(y_-y)))
以下为该程序实例:
import tensorflow as tf
from numpy.random import RandomState
#定义数据包大小
batch_size = 8
w1 = tf.Variable(tf.random_normal((2, 1), stddev=2, seed=1))
x = tf.placeholder(tf.float32, shape=[None, 2], name="x_input")
#一个输出节点
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y_input")
y = tf.matmul(x, w1)#由神经网络给出的预测
#定义两种成本
loss_less = 10
loss_more = 1
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), loss_more*(y-y_), loss_less*(y_-y)))
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
#生成数据集
rdm = RandomState(1)#当调用seed时,无法调用rand方法
data_size = 128
X = rdm.rand(data_size, 2)
#加入了噪声
Y = [[x1 + x2 + rdm.rand()/10.0-0.05] for (x1, x2) in X]
#训练
with tf.Session() as sess:
ini_op = tf.global_variables_initializer()
sess.run(ini_op)
STEPS = 5000
for i in range(STEPS):
start = (i * batch_size) % data_size
end = min(start+batch_size, data_size)
sess.run(train_step, feed_dict={x: X[start, end], y_: Y[start, end]})
print(sess.run(w1))