首頁  >  文章  >  後端開發  >  為什麼在小資料集上微調 MLP 模型,仍然保持與預訓練權重相同的測試精度?

為什麼在小資料集上微調 MLP 模型,仍然保持與預訓練權重相同的測試精度?

WBOY
WBOY轉載
2024-02-10 21:36:04606瀏覽

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

問題內容

我設計了一個簡單的 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-3
batch_size = 64
device = torch.device("cuda")
seed = 42
torch.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 network
for 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()     # a

model_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()。

以上是為什麼在小資料集上微調 MLP 模型,仍然保持與預訓練權重相同的測試精度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除