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())

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐