还不会分割训练集和验证集?让大模型来帮你

文章主旨

本文针对初学机器学习人员,利用文心一言等大预研模型,通过有效提问,实现利用大语言模型来辅助快速编写pytorch框架下python程序的目的。

问题描述

在攻打比赛过程中,发现训练集的损失函数不断收敛,但比赛分数并没有随之上涨。以下是训练集的损失函数变化:

Epoch70/1600,Loss:0.307704523417957 
Epoch71/1600,Loss:0.249927623173859 
Epoch72/1600,Loss:0.258905884184981 
Epoch73/1600,Loss:0.295816174437162 
Epoch74/1600,Loss:0.234433079421332

于是怀疑在训练过程中存在过拟合现象。

问题解决

在文心一言大模型中,用自然语言的描述形式向其提问:
在这里插入图片描述
文心一言给出的官方有营养回答是:

import torch
from torch.utils.data import DataLoader, random_split
from sklearn.preprocessing import LabelEncoder
import torch.nn as nn
import torch.optim as optim

# 假设你已经定义了IQDataset_train, IQDataset_test, 和 ModulationRecognitionModel
# 以及其他必要的参数如input_size, batch_size, num_epochs, learning_rate, device

# 加载数据集
train_dataset = IQDataset_train('train.json', transform=transform)
test_dataset = IQDataset_test('test.json', transform=transform)

# 分割训练数据集为训练集和验证集
train_size = int(0.8 * len(train_dataset))  # 80% 用于训练,20% 用于验证
val_size = len(train_dataset) - train_size
train_dataset, val_dataset = random_split(train_dataset, [train_size, val_size])

# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# 编码标签
label_encoder = LabelEncoder()
train_labels = train_dataset.labels
train_labels_encoded = label_encoder.fit_transform(train_labels)
num_classes = len(label_encoder.classes_)

# 初始化模型、损失函数和优化器
model = ModulationRecognitionModel(input_dim=input_size*2, output_dim=num_classes).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 保存模型的最佳状态
best_val_loss = float('inf')
best_model_wts = model.state_dict()

for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for iq_data, id, label in train_loader:
        iq_data, label = iq_data.to(device), label.to(device)
        optimizer.zero_grad()
        outputs = model(iq_data)
        loss = criterion(outputs, label)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()

    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader):.15f}')

    # 验证阶段
    model.eval()
    val_loss = 0.0
    with torch.no_grad():
        for iq_data, id, label in val_loader:
            iq_data, label = iq_data.to(device), label.to(device)
            outputs = model(iq_data)
            loss = criterion(outputs, label)
            val_loss += loss.item()

    val_loss /= len(val_loader)
    print(f'Validation Loss: {val_loss:.15f}')

    # 检查是否保存模型
    if val_loss < best_val_loss:
        best_val_loss = val_loss
        best_model_wts = model.state_dict()

    # 检查是否需要调整学习率
    if epoch % 50 == 0 and epoch != 0:
        for param_group in optimizer.param_groups:
            param_group['lr'] /= 1.4
        print(f'Learning rate reduced to {optimizer.param_groups[0]["lr"]:.6f} at epoch {epoch+1}')

# 加载最佳模型权重
model.load_state_dict(best_model_wts)
# 在这里可以添加保存模型的代码,例如:
# torch.save(model.state_dict(), 'best_model.pth')

有时在和大语言模型的对话中,发现有时自己没说清楚的东西,竟然他在代码中也考虑到了,可能自己在他的面前就是小学生吧。其他大语言模型可以尝试阿里巴巴的通义大模型、腾讯的混元大模型和科大讯飞的星火大模型,欢迎在留言区把各位的心得进行交流。

解决效果

大模型出手后是立竿见影、手起刀落、药到病除。

Epoch70/1000,Loss:0.485642382948417
Validation Loss:0.175171304959804
Epoch71/1000,Loss:0.444372663347740
Validation Loss:0.151291660964489
Epoch72/1000,Loss:0.440837071511865
Validation Loss:0.159813182428479
Epoch73/1000,Loss:0.447838771413630
Validation Loss:0.172257545404136
Epoch74/1000,Loss:0.482291213170750
Validation Loss:0.186672694748268

至于比赛的名次是否上升。根据小伙伴们评论区的留言热烈情况再和大家汇报。
后续还会增加大模型解决其他简易类代码修改问题,敬请留意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aidesignplus

你的鼓励将是我GPU的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值