所有神经网络在训练过程中都需要选择超参数,而这些超参数对收敛速度和最终性能有着非常显著的影响。
这些超参数需要特别调整,以充分发挥模型的潜力。超参数调优过程是神经网络训练中不可或缺的一部分,某种程度上,它是一个主要基于梯度优化问题中的“无梯度”部分。
在这篇文章中,我们将探讨超参数优化的领先库之一——Optuna,它使这一过程变得非常简单且高效。我们将把这个过程分为5个简单的步骤。
第一步:定义模型
首先,我们将导入相关的包,并使用PyTorch创建一个简单的全连接神经网络。该全连接神经网络包含一个隐藏层。
为了保证可复现性,我们还设置了一个手动随机种子。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.utils.data import random_split
import optuna
SEED = 42
torch.manual_seed(SEED)
random.seed(SEED)
# Define a simple neural network
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.flatten(x, 1)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
第二步:定义搜索空间和目标函数
接下来,我们将设置超参数优化所需的标准组件。我们将执行以下步骤:
2.定义超参数搜索空间:
我们定义(a)想要优化的超参数,以及(b)允许这些超参数取值的范围。在我们的例子中,我们将选择以下超参数:
-
神经网络隐藏层大小——整数值。
-
学习率——对数分布的浮点值。
-
优化器选择:分类选择(无顺序),在以下选项中选择:[“Adam”, “SGD”]。
3.定义目标函数:
# Split data into train and validation sets
transfor