1.神经网络复杂度
神经网络的复杂度基本都是用NN层数和NN参数的个数表示
空间复杂度:
- 层数=隐藏层的层数+1个输出层,下图为2层的NN
- 总参数 = 总w + 总b
上图第一层:3x4+4个参数(三个输入,4个神经元,4个偏置b)
上图第二层:4x2+2
所以总参数是:3x4+4+4x2+2=26
时间复杂度:
乘加运算次数
左图:3x4+4x2=20
2.参数迭代更新
学习率小了训练很慢,学习率大了会跳过最优解。因此可以选取指数衰减学习率
指数衰减学习率:
可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使得模型在训练后期稳定。
指数衰减学习率 = 初始学习率 * 学习率衰减率(当前轮数 / 多少轮衰减一次)
3.激活函数
3.1Sigmioid函数
3.2Tanh函数
3.3relu函数
3.4总结
对于初学者建议:
- 首选relu激活函数
- 学习率设置较小值
- 输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布
- 初始参数中心化,即让随机生成的参数满足以0为均值,根号(2 / 当前层输入特征个数)为标准差的正态分布
4.损失函数
损失函数是指预测值(y)与已知答案(y_)的差距
5.案例
预测酸奶日销量y,x1、x2是影响日销量的因素。
建模前,应预先采集的数据有:每日x1、x2和销量y_(即已知答案,最佳情况:产量=销量)
拟造数据集X,Y_:y_ = x1+x2.噪声:-0.05~+0.05
import tensorflow as tf
import numpy as np
SEED = 23455
rdm = np.random.RandomState(seed=SEED) # 生成[0,1)之间的随机数
x = rdm.rand(32, 2)
# print(x)
y_ = [[x1 + x2 + (rdm.rand() / 10 - 0.05)] for (x1, x2) in x] # y再加上一个生成的噪声[0,1)/10 = [0, 0.1)
x = tf.cast(x, dtype=tf.float32)
w1 = tf.Variable(tf.random.normal([2, 1], stddev=1, seed=1))
epoch = 1500
lr = 0.002
for epoch in range(epoch):
with tf.GradientTape() as tape:
y = tf.matmul(x, w1)
loss_mse = tf.reduce_mean(tf.square(y_ - y))
grads = tape.gradient(loss_mse, w1)
w1.assign_sub(lr * grads)
if epoch % 50 == 0:
print("After %d training steps, w1 is " %(epoch))
print(w1.numpy(), "\n")
print("Final w1 is:", w1.numpy())