【TensorFlow】复杂度、学习率

神经网络的复杂度

NN复杂度:多用NN层数和NN参数的个数表示

空间复杂度

空间复杂度(访存量),严格来讲包括两部分:总参数量 + 各层输出特征图。参数量:模型所有带参数的层的权重参数总量;特征图:模型在实时运行过程中每层所计算出的输出特征图大小。
通常,使用NN层数和NN参数的个数表示来衡量。
层数=隐藏层的层数+1个输出层
总参数= 总w + 总b

时间复杂度

即模型的运算次数,可用浮点运算次数(FPLOPs, FLoating-point OPerations)或者乘加运算次数衡量,这里采用乘加运算的总次数来衡量。

例:
在这里插入图片描述
其空间复杂度:3 * 4+4(第一层)+4 * 2+2(第二层)=26
时间复杂度:3 * 4(第一层)+4 * 2(第二层)=20

学习率

在这里插入图片描述
例:

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))

lr = 0.2
epoch = 40

for epoch in range(epoch):  # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环40次迭代。
    with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程。
        loss = tf.square(w + 1)
    grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导

    w.assign_sub(lr * grads)  # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))

# lr初始值:0.2   请自改学习率  0.001  0.999 看收敛过程
# 最终目的:找到 loss 最小 即 w = -1 的最优参数w

指数衰减学习率

可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使模型在训练后期稳定。

指数衰减学习率= 初始学习率* 学习率衰减率^(当前轮数/ 多少轮衰减一次)

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))

epoch = 40
LR_BASE = 0.2  # 最初学习率
LR_DECAY = 0.99  # 学习率衰减率
LR_STEP = 1  # 喂入多少轮BATCH_SIZE后,更新一次学习率

for epoch in range(epoch):  # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环100次迭代。
    lr = LR_BASE * LR_DECAY ** (epoch / LR_STEP)
    with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程。
        loss = tf.square(w + 1)
    grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导

    w.assign_sub(lr * grads)  # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f,lr is %f" % (epoch, w.numpy(), loss, lr))

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45654306/article/details/112798432