- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Deepleaning 和 Pytorch 的初学者。
我不明白如何在使用 SWA 时使用 BatchNormalization。
pytorch.org 在 https://pytorch.org/blog/stochastic-weight-averaging-in-pytorch/ 中说:
Note that the SWA averages of the weights are never used to make predictions during training, and so the batch normalization layers do not have the activation statistics computed after you reset the weights of your model with
opt.swap_swa_sgd()
这意味着它适合在使用SWA之后添加BatchNormalization层吗?
# it means, in my idea
#for example
opt = torchcontrib.optim.SWA(base_opt)
for i in range(100):
opt.zero_grad()
loss_fn(model(input), target).backward()
opt.step()
if i > 10 and i % 5 == 0:
opt.update_swa()
opt.swap_swa_sgd()
#save model once
torch.save(model,"swa_model.pt")
#model_load
saved_model=torch.load("swa_model.pt")
#it means adding BatchNormalization layer??
model2=saved_model
model2.add_module("Batch1",nn.BatchNorm1d(10))
# decay learning_rate more
learning_rate=0.005
optimizer = torch.optim.SGD(model2.parameters(), lr=learning_rate)
# train model again
for epoch in range(num_epochs):
loss = train(train_loader)
val_loss, val_acc = valid(test_loader)
非常感谢您的回复。
听从您的建议,
我尝试制作添加 optimizer.bn_update() 的示例模型
# add optimizer.bn_update() to model
criterion = nn.CrossEntropyLoss()
learning_rate=0.01
base_opt = torch.optim.SGD(model.parameters(), lr=0.1)
optimizer = SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05)
def train(train_loader):
#mode:train
model.train()
running_loss = 0
for batch_idx, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
#loss
loss = criterion(outputs, labels)
running_loss += loss.item()
loss.backward()
optimizer.step()
optimizer.swap_swa_sgd()
train_loss = running_loss / len(train_loader)
return train_loss
def valid(test_loader):
model.eval()
running_loss = 0
correct = 0
total = 0
#torch.no_grad
with torch.no_grad():
for batch_idx, (images, labels) in enumerate(test_loader):
outputs = model(images)
loss = criterion(outputs, labels)
running_loss += loss.item()
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
total += labels.size(0)
val_loss = running_loss / len(test_loader)
val_acc = float(correct) / total
return val_loss, val_acc
num_epochs=30
loss_list = []
val_loss_list = []
val_acc_list = []
for epoch in range(num_epochs):
loss = train(train_loader)
val_loss, val_acc = valid(test_loader)
optimizer.bn_update(train_loader, model)
print('epoch %d, loss: %.4f val_loss: %.4f val_acc: %.4f'
% (epoch, loss, val_loss, val_acc))
# logging
loss_list.append(loss)
val_loss_list.append(val_loss)
val_acc_list.append(val_acc)
# optimizer.bn_updata()
optimizer.bn_update(train_loader, model)
# go on evaluating model,,,
最佳答案
文档告诉您的是,由于 SWA 计算权重的平均值,但这些权重在训练期间不用于预测,因此批量归一化层不会看到这些权重。这意味着他们没有为他们计算各自的统计数据(因为他们永远无法计算)这很重要,因为权重是在实际预测期间使用的(即不在训练期间)。
这意味着,他们假定您的模型中有批量归一化层,并希望使用 SWA 对其进行训练。由于上述原因,这(或多或少)不是直截了当的。 p>
一种方法如下:
To compute the activation statistics you can just make a forward pass on your training data using the SWA model once the training is finished.
或者你可以使用他们的帮助类:
In the
SWA
class we provide a helper functionopt.bn_update(train_loader, model)
. It updates the activation statistics for every batch normalization layer in the model by making a forward pass on thetrain_loader
data loader. You only need to call this function once in the end of training.
如果您使用的是 Pytorch 的 DataLoader
class您可以简单地将模型(训练后)和训练加载器提供给 bn_update
函数,该函数会为您更新所有批量归一化统计信息。该函数只需要在训练结束时调用一次即可。
进行的步骤:
opt.bn_update(train_loader, model)
并提供您的训练模型关于python-3.x - 如何使用 SWA :stochastic weights average? 添加 BatchNormalization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57406061/
BatchNormalization 和 TimeDistributed(BatchNormalization) 是否对顺序数据(例如视频)有相同的影响?如果不是有什么区别? 最佳答案 在 tf.ke
我正在尝试将预训练的 BN 权重从 pytorch 模型复制到其等效的 Keras 模型,但我不断得到不同的输出。 我阅读了 Keras 和 Pytorch BN 文档,我认为区别在于它们计算“均值”
我有两种类型的灰度图像,比如汽车和飞机。在我的训练集中,我有 1000 张图像(大约 50/50 分割)。在这个训练集中,我所有的飞机示例都在白色背景上,而所有汽车示例都在黑色背景上(这是故意的,模型
我正在训练一个 CNN,为了调试我的问题,我正在研究实际训练数据的一小部分。 在训练期间,损失和准确性似乎非常合理且相当不错。 (在示例中我使用了相同的小子集进行验证,问题已经在这里显示了) 适合 x
我有这些 Backprop 更新,请让我知道 dx 部分哪里出了问题。在计算图中,我使用X、sample_mean 和sample_var。感谢您的帮助 (x, norm, sample_mean,
我对如何使用/插入"BatchNorm"有点困惑我的模型中的图层。 我看到了几种不同的方法,例如: ResNets : "BatchNorm"+"Scale" (无参数共享) “BatchNorm”
我想弄清楚 Keras 中的批量归一化究竟做了什么。现在我有以下代码。 for i in range(8): c = Convolution2D(128, 3, 3, border_mode
我正在尝试将批量规范添加到 Keras 中的 vgg 样式模型。当我添加 batch norm 层时,出现错误: FailedPreconditionError: Attempting to use
keras BatchNormalization layer使用 axis=-1 作为默认值,并说明特征轴通常是归一化的。为什么会这样? 我想这很令人惊讶,因为我更熟悉使用类似 StandardSca
是 batchnorm momentum convention (默认值=0.1)与其他库一样正确,例如Tensorflow 好像一般默认是 0.9 或者 0.99?或者也许我们只是使用了不同的约定?
在 Keras 中实现 Residual Network 时出现错误。下面是给我错误的代码(错误来自函数定义最后一步的第一行): 加载包: import numpy as np from keras
我正在尝试保存模型,然后稍后加载它以进行一些预测;发生的事情是训练后模型的准确率是95%+ ,但是当我保存它然后加载它时,准确度下降到接近 10%在 同 数据集。 要重现此错误结果,您可以运行 thi
我有以下代码。 x = keras.layers.Input(batch_shape = (None, 4096)) hidden = keras.layers.Dense(512, activati
我正在通过时间序列数据训练 LSTM 网络,并希望对数据进行标准化,因为我的特征具有不同的规模。 我的数据形状是 (n_samples x n_timestamps x n_features) 我想使
我目前正在学习在我的项目中使用 Tensorflow-2.0。我想使用卷积神经网络(CNN)完成一个语义分割任务,在编码时发现一个奇怪的错误。 首先,构建了一个简单的模型并且运行良好。 X_train
我的问题是 BatchNormalization (BN) 正在标准化什么。 我问,BN 是单独对每个像素的 channel 进行归一化,还是对所有像素一起归一化。它是在每个图像的基础上还是在整个批处
我的 LSTM 网络有 5 个输入。第一个输入的典型值为 1000 到 3000。其余输入的值为 -1 到 1。 我想插入 BatchNormalization 作为第一层。但输入 2-5 已经在 -
inputs = Input((img_height, img_width, img_ch)) conv1 = Conv2D(n_filters, (k, k), padding=padding)(i
我正在尝试使用 Tensorflow 从 GAN 保存生成器模型。我正在使用的模型有几个批量归一化层。当我保存权重时,只有运行全局变量初始值设定项才能成功恢复它们,但我不必这样做,因为所有变量都正在恢
过了一段时间我又回到了tensorflow,看起来情况已经完全改变了。 但是,之前我曾经在训练循环中使用 tf.contrib....batch_normalization 并进行以下操作: upda
我是一名优秀的程序员,十分优秀!