街景字符编码识别(四)—— 模型训练与验证

本文详细介绍了深度学习模型训练的完整流程,包括模型构建、训练、验证、调参及保存等关键步骤。通过实例展示了如何使用PyTorch进行数据加载、模型训练与验证,以及如何保存和加载模型。此外,还提供了模型调参的基本策略。

模型训练

模型加载和保存

模型调参流程

模型训练:构造训练集和验证集,每轮进行训练和验证,并根据最优验证集精度保存模型,代码如下:

train_loader = torch.utils.data.DataLoader(
    train_dataset,
    batch_size=10, 
    shuffle=False, 
    num_workers=0, 
)
    
val_loader = torch.utils.data.DataLoader(
    val_dataset,
    batch_size=10, 
    shuffle=False, 
    num_workers=0, 
)

model = SVHN_Model1()
criterion = nn.CrossEntropyLoss (size_average=False)
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0
for epoch in range(20):
    print('Epoch: ', epoch)

    train(train_loader, model, criterion, optimizer, epoch)
    val_loss = validate(val_loader, model, criterion)
    
    # 记录下验证集精度
    if val_loss < best_loss:
        best_loss = val_loss
        torch.save(model.state_dict(), './model.pt')

每个Epoch的训练代码:

def train(train_loader, model, criterion, optimizer, epoch):
    # 切换模型为训练模式
    model.train()

    for i, (input, target) in enumerate(train_loader):
        c0, c1, c2, c3, c4, c5 = model(data[0])
        loss = criterion(c0, data[1][:, 0]) + \
                criterion(c1, data[1][:, 1]) + \
                criterion(c2, data[1][:, 2]) + \
                criterion(c3, data[1][:, 3]) + \
                criterion(c4, data[1][:, 4]) + \
                criterion(c5, data[1][:, 5])
        loss /= 6
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
Epoch的验证代码:
def validate(val_loader, model, criterion):
    # 切换模型为预测模型
    model.eval()
    val_loss = []

    # 不记录模型梯度信息
    with torch.no_grad():
        for i, (input, target) in enumerate(val_loader):
            c0, c1, c2, c3, c4, c5 = model(data[0])
            loss = criterion(c0, data[1][:, 0]) + \
                    criterion(c1, data[1][:, 1]) + \
                    criterion(c2, data[1][:, 2]) + \
                    criterion(c3, data[1][:, 3]) + \
                    criterion(c4, data[1][:, 4]) + \
                    criterion(c5, data[1][:, 5])
            loss /= 6
            val_loss.append(loss.item())
    return np.mean(val_loss)

模型加载和保存:

torch.save(model_object.state_dict(), ‘model.pt’)
model.load_state_dict(torch.load(’ model.pt’))

模型调参流程:
根据baseline的模型,跑通训练、验证和预测的流程;
简单CNN模型的损失会比较大,尝试增加模型复杂度,并观察验证集精度;如果精度太低,可以在增加模型复杂度的同时增加数据扩增方法,直至验证集精度不变。

<think>根据用户问题,需要查找天池学习赛街景字符编码识别所使用的损失函数。回顾提供的引用,特别是引用[4]中提到了损失函数的具体使用。 在引用[4]中,明确提到: - 选择损失函数为交叉熵损失(CrossEntropyLoss) - 代码示例:`criterion = nn.CrossEntropyLoss()` - 在计算损失时,对每个字符位置(c0, c1, c2, c3, c4)分别计算交叉熵损失,并将它们相加得到总损失。 因此,该比赛使用的损失函数是交叉熵损失函数,并且由于任务是多字符识别(每个字符位置独立),所以总损失是各个位置损失之和。 另外,引用[2]中提到赛题是一个字符识别问题,有三种解决思路,其中定长字符识别是其中一种。在定长字符识别中,将整个字符串识别视为多个独立的字符分类问题,因此每个字符位置使用独立的分类损失(交叉熵)是合理的。 所以,可以总结:天池学习赛街景字符编码识别中使用的损失函数是交叉熵损失(CrossEntropy Loss),具体实现是对每个字符位置的预测分别计算交叉熵损失,然后求和作为总损失。 注意:用户引用的内容中并没有提到其他损失函数,因此以引用[4]的代码为准。 </think> ### 天池学习赛街景字符编码识别的损失函数 根据提供的引用资料,天池学习赛街景字符编码识别任务中使用的损失函数是**交叉熵损失(CrossEntropy Loss)**。具体实现细节如下: 1. **损失函数选择** 在PyTorch框架中,直接使用`nn.CrossEntropyLoss()`作为损失函数[^4]。该函数适用于多分类任务,能有效衡量模型预测概率分布真实标签的差异。 2. **损失计算方式** 由于赛题要求识别**5位定长字符**(如街道编号),模型会对每个字符位置独立预测: ```python c0, c1, c2, c3, c4 = model(input) # 输出5个字符位置的预测结果 ``` 总损失是**5个字符位置损失之和**: ```python loss = criterion(c0, target[:, 0]) + \ criterion(c1, target[:, 1]) + \ criterion(c2, target[:, 2]) + \ criterion(c3, target[:, 3]) + \ criterion(c4, target[:, 4]) ``` 这种设计源于赛题的定长字符识别思路[^2][^3]。 3. **数学原理** 交叉熵损失公式为: $$L = -\sum_{i=1}^{C} y_i \log(p_i)$$ 其中 $C$ 是字符类别数(0~9共10类),$y_i$ 是真实标签的one-hot编码,$p_i$ 是模型预测的类别概率。 ### 补充说明 - **任务特性**:赛题将街景字符识别转化为**多任务分类问题**,每个字符位置独立预测。 - **优化目标**:通过Adam优化器最小化总损失,学习率设为0.001[^4]。 - **适用性**:交叉熵损失是分类任务的基准选择,尤其适合类别互斥的场景(如单个数字识别)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值