PHP前端开发

为什么在小数据集上微调 MLP 模型,仍然保持与预训练权重相同的测试精度?

百变鹏仔 1天前 #Python
文章标签 权重
问题内容

我设计了一个简单的 mlp 模型,在 6k 数据样本上进行训练。

class mlp(nn.module):    def __init__(self,input_dim=92, hidden_dim = 150, num_classes=2):        super().__init__()        self.input_dim = input_dim        self.num_classes = num_classes        self.hidden_dim = hidden_dim        #self.softmax = nn.softmax(dim=1)        self.layers = nn.sequential(            nn.linear(self.input_dim, self.hidden_dim),            nn.relu(),            nn.linear(self.hidden_dim, self.hidden_dim),            nn.relu(),            nn.linear(self.hidden_dim, self.hidden_dim),            nn.relu(),            nn.linear(self.hidden_dim, self.num_classes),        )    def forward(self, x):        x = self.layers(x)        return x

并且模型已实例化

model = mlp(input_dim=input_dim, hidden_dim=hidden_dim, num_classes=num_classes).to(device)optimizer = optimizer.adam(model.parameters(), lr=learning_rate, weight_decay=1e-4)criterion = nn.crossentropyloss()

和超参数:

num_epoch = 300   # 200e3//len(train_loader)learning_rate = 1e-3batch_size = 64device = torch.device("cuda")seed = 42torch.manual_seed(42)

我的实现主要遵循这个问题。我将模型保存为预训练权重 model_weights.pth。

model在测试数据集上的准确率是96.80%。

然后,我还有另外 50 个样本(在 finetune_loader 中),我正在尝试在这 50 个样本上微调模型:

model_finetune = MLP()model_finetune.load_state_dict(torch.load('model_weights.pth'))model_finetune.to(device)model_finetune.train()# train the networkfor t in tqdm(range(num_epoch)):  for i, data in enumerate(finetune_loader, 0):    #def closure():      # Get and prepare inputs      inputs, targets = data      inputs, targets = inputs.float(), targets.long()      inputs, targets = inputs.to(device), targets.to(device)            # Zero the gradients      optimizer.zero_grad()      # Perform forward pass      outputs = model_finetune(inputs)      # Compute loss      loss = criterion(outputs, targets)      # Perform backward pass      loss.backward()      #return loss      optimizer.step()     # amodel_finetune.eval()with torch.no_grad():    outputs2 = model_finetune(test_data)    #predicted_labels = outputs.squeeze().tolist()    _, preds = torch.max(outputs2, 1)    prediction_test = np.array(preds.cpu())    accuracy_test_finetune = accuracy_score(y_test, prediction_test)    accuracy_test_finetune        Output: 0.9680851063829787

我检查过,精度与将模型微调到 50 个样本之前保持不变,并且输出概率也相同。

可能是什么原因?我在微调代码中是否犯了一些错误?


正确答案


您必须使用新模型(model_finetune 对象)重新初始化优化器。目前,正如我在您的代码中看到的那样,它似乎仍然使用使用旧模型权重初始化的优化器 - model.parameters()。