为什么在小数据集上微调 MLP 模型,仍然保持与预训练权重相同的测试精度?
短信预约 -IT技能 免费直播动态提醒
问题内容
我设计了一个简单的 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 模型,仍然保持与预训练权重相同的测试精度?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
为什么在小数据集上微调 MLP 模型,仍然保持与预训练权重相同的测试精度?
下载Word文档到电脑,方便收藏和打印~
下载Word文档
相关文章
- 如何在 Java 中进行 PropertyGrid 的性能优化?(Java中PropertyGrid的性能优化方法)
- Java ushort 类型存在哪些安全隐患?如何进行分析?(java ushort类型的安全隐患分析 )
- Java 高并发编程的最佳实践都有哪些?(java高并发编程的最佳实践有哪些)
- Java 中如何定义一个方法?(详细教程)(java怎么定义一个方法)
- 在 Java 中,反射究竟是什么?(java中反射是什么)
- Java 中 metrics 的作用究竟是什么?(java中metrics的作用是什么)
- Java 怎样才能编译成 class?(java如何编译成class)
- 掌握PHP数据类型转换:实用工具与技巧
- 如何在 Java 中获取当前路径?(java怎么获取当前路径)
- 如何在 Java 中查看变量类型?(java查看变量类型的方法是什么)
猜你喜欢
为什么在小数据集上微调 MLP 模型,仍然保持与预训练权重相同的测试精度?
问题内容我设计了一个简单的 mlp 模型,在 6k 数据样本上进行训练。class mlp(nn.module):def __init__(self,input_dim=92, hidden_dim = 150, num_classes
2024-02-10