我正在为许多优化器运行线性回归.我注意到,如果首先激活了SGD,其他的都有很好的准确性.否则,Adam和RMSsprop提出了可怕的调整.

# Generate synthetic data
X_numpy, y_numpy = datasets.make_regression(n_samples=100, n_features=1, noise=20, random_state=15)

X = torch.from_numpy(X_numpy.astype(np.float32))
y = torch.from_numpy(y_numpy.astype(np.float32))
y = y.view(y.shape[0], 1)

# Define the model
n_samples, n_features = X.shape
input_size = n_features
output_size = 1
model = nn.Linear(input_size, output_size)

# Define learning rate
learning_rate = 0.01

# Define criteria
criterion = nn.MSELoss()

# Define different optimizers
optimizers = {    
    "Adam": torch.optim.Adam(model.parameters(), lr=learning_rate),
    "RMSprop": torch.optim.RMSprop(model.parameters(), lr=learning_rate),
    "SGD": torch.optim.SGD(model.parameters(), lr=learning_rate),
}

# Training loop for each optimizer
num_epochs = 100
predictions = {}
for optimizer_name, optimizer in optimizers.items():
    print(f"Optimizer: {optimizer_name}")
    predictions[optimizer_name] = []
    for epoch in range(num_epochs):        
        y_predicted = model(X)
        loss = criterion(y_predicted, y)
        loss.backward()
        optimizer.step() #update wights
        optimizer.zero_grad() #zero the gradients
    predictions[optimizer_name] = model(X).detach().numpy()

# Plotting predictions with different colors
plt.figure(figsize=(10, 6))
plt.plot(X_numpy, y_numpy, 'ro', label='Original Data')
for optimizer_name, prediction in predictions.items():
    plt.plot(X_numpy, prediction, label=optimizer_name)
plt.legend()
plt.show()

上面的代码生成预测:

enter image description here

如果我先运行SGD,会发生以下情况:

optimizers = {    
    "Adam": torch.optim.Adam(model.parameters(), lr=learning_rate),
    "RMSprop": torch.optim.RMSprop(model.parameters(), lr=learning_rate),
    "SGD": torch.optim.SGD(model.parameters(), lr=learning_rate),
}

enter image description here

为什么会这样?

推荐答案

问题是,您对所有回归都保留相同的模型,这意味着当第一次优化结束时,您将使用训练过的模型进行下一次优化.学习率只适用于SGD(对于其他两个优化器来说似乎太大了),所以总结这两种情况:

  • 如果你从另外两个开始,模型就不会表现得很好,模型也不适合这些点.在第三次训练(SGD)中,模型将被适当训练并拟合点.

  • 如果你开始使用SGD,它将训练模型,随后的两次训练不会改变权重,从而获得类似的性能

相反,您应该重置模型并定义优化器特定的学习率:

optimizers = dict(    
    RMSprop=(torch.optim.RMSprop, 0.3),
    SGD=(torch.optim.SGD, 0.01),
    Adam=(torch.optim.Adam, 0.5),
)

for optimizer_name, (klass,lr) in optimizers.items():
    model = copy.deepcopy(model_)
    optimizer = klass(model.parameters(), lr=lr)
    ## Proceed with your training loop

使用上述设置,您将得到以下拟合,regardless of the order of execution.

enter image description here

Python相关问答推荐

Python plt.text中重叠,包adjust_text不起作用,如何修复?

如何在Python中使用io.BytesIO写入现有缓冲区?

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

如何删除索引过go 的lexsort深度可能会影响性能?' &>

删除字符串中第一次出现单词后的所有内容

如果值发生变化,则列上的极性累积和

梯度下降:简化要素集的运行时间比原始要素集长

为什么\b在这个正则表达式中不解释为反斜杠

未调用自定义JSON编码器

基于Scipy插值法的三次样条系数

我对这个简单的异步者的例子有什么错误的理解吗?

使用Python异步地持久跟踪用户输入

在numpy数组中寻找楼梯状 struct

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

Seaborn散点图使用多个不同的标记而不是点

read_csv分隔符正在创建无关的空列

根据过滤后的牛郎星图表中的数据计算新系列

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

时间戳上的SOAP头签名无效