神经网络优化
- 神经元模型:神经网络的基本单位
- 激活函数:映入非线性激活因素,提高模型的表达力。
常用的激活函数为ReLu、Sigmod、tanh等
一般为了防止梯度消失(vanishing gradient)和梯度爆炸(gradient explording)常选用ReLu(注:CS231N也指出过常用的激活函数为ReLu)
tf.nn.relu()
tf.nn.sigmoid()
tf.nn.tanh()
- 神经网络的复杂度:可用神经网络的层数和神经网络待优化参数的个数表示
- 神经网络的层数:一般不计入输入层, 层数 = n个隐藏层 + 1个输入层
- 神经网络待优化参数: 神经网络中所有参数W的个数 + 1个输出层
- 损失函数(loss):用来表示预测值(y)与已知答案(y_)的差距。 在训练神经网络时,通过不断改变神经网络中所有参数,使损失函数不断减小,从而训练出更高准确率的神经网络模型。
- 常用的损失函数有均方误差、自定义和交叉熵等。
例如:
预测酸奶日销量 y, x1 和 x2 是影响日销量的两个因素。
即:用神经网络拟合y_ = X1 + X2的数据。为了更真实, 加入了正负0.05的随机噪声。
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]
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)
loss_mse = tf.reduce_mean(tf.square(y_ - y))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
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 = start + 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 is ", sess.run(w1))
print("Final w1 is :\n", sess.run(w1))
tip:可以尝试改变学习率的值,观察参数变化和收敛情况
Final w1 is :
[[0.98019385]
[1.0159807 ]]
* 预测结果 * : y = 0.98*X1 + 1.02*X2 基本符合
- 自定义损失