LSTM模型后增加Dense(全连接)层的目的是什么?
- LSTM的输出是最后一个时刻的h,是个unit维的向量,必须接一个全连接层才能把LSTM的输出转换成你想要的输出,可以简单理解成维度变换。
- LSTM输出的向量的维度是指定的units,但是最后在计算损失的时候是用的标签,标签也是向量,但是标签的向量维数和units不一致,这样就没有办法计算损失了,所以要加一个Dense将输出的向量转换成标签向量的维度,这样就可以计算损失了
pytorch中LSTM的输出的理解,以及batch_first=True or False的输出层的区别?
首先,pytorch中LSTM的输出一般用到的是输出层和隐藏层这两个,另一个细胞状态,我没咋用过,就不讲了。
一般两种用法,要么将输出层全连接然后得出结果,要么用隐藏层全连接,然后得出结果,有学长说用隐藏层效果会好一点。两种用法应该都可以。如果网络只有一层的时候,用输出层和隐藏层是没有任何区别的,当网络层数大于1时,才会有区别。https://blog.csdn.net/qq_52785473/article/details/124368762
lstm里的dropout
含义
在训练过程中,对神经网络单元按照一定比例暂时将其丢弃。
原理
由于网络参数过多,训练数据少,或者训练次数过多,会产生过拟合的现象。
dropout产生的一个重大原因就是为了避免过拟合。 每一层的神经元按照不同的概率进行dropout,这样每次训练的网络都不一样,对每一个的batch就相当于训练了一个网络,dropout本质是一种模型融合的方式,当dropout设置为0.5时,模型总类最多为2^n, 另外在更新参数时,只对保留的神经元进行更新,也能加快训练速度。
torch.optim.Adam
优化器。优化器(optim)不同参数组,不同学习率设置的操作
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
- params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
- lr (float, 可选) – 学习率(默认:1e-3)
- betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
- eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
- weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
AverageValueMeter
AverageValueMeter能够计算所有数的平均值和标准差,同意几个epoch中损失的平均值。
tqdm
Tqdm 是Python 进度条库,可以在 Python 长循环中添加一个进度提示信息。
optimizer.zero_grad()
optimizer.zero_grad() 是 PyTorch 中定义优化器的一个方法,它会将模型中所有可训练的参数的梯度清零。在训练神经网络时,通常需要在每次迭代之前调用这个函数。因为如果不清零梯度,那么优化器在更新权重时会累加之前的梯度。
train_loss.backward()
这是一个 PyTorch 中的函数,用于计算神经网络的反向传播梯度。它将计算出每个参数的梯度,并将其存储在参数的.grad属性中,以便在优化器中使用。
optimizer.step()
optimizer.step() 是 PyTorch 中用于更新模型参数的函数,它会根据当前的梯度和学习率来更新模型参数。通常在训练神经网络时,我们会在每个 batch 的训练结束后调用 optimizer.step() 来更新模型参数。
epoch_loss += train_loss.item()<