「代码词典 · 一词一义」(四)epochs和batch_size

 一、epochs=50 是啥?为什么叫 epoch

 在深度学习中:

一个 epoch 表示把整个训练数据集 完整看一遍

举个例子:

你有 1000 条训练数据,如果训练 50 个 epoch,就是把这 1000 条数据看 50 遍,不断优化模型。

 那 epoch 这个词本来的意思是啥?

英文词源解释:
  • epoch(读音:/ˈiː.pɒk/ 或 /ˈɛpək/)原意是:

    📅 “时代”、“纪元”,某个特别重要的时间节点

 比如在天文、历史里你可能会看到:

  • the epoch of the Renaissance(文艺复兴的时代)

  • epoch time(计算机用来表示“1970年1月1日”的那个零点)

在深度学习中,它被引申为:

 “一次完整学习的周期” —— 看完一遍所有训练数据,就叫一个 epoch。

是不是有点像“模型成长的一段时期”?所以用 epoch,很形象!


二、batch_size=32 是啥?batch 是哪来的?

 在深度学习中:

一次训练使用多少条样本,就叫一个 batch(批)

也就是模型一次性吃多少数据。

例如:

  • 有 1000 个样本,batch_size = 32

  • 模型每次读 32 条数据,共需要训练 1000/32 ≈ 32 次,才算看完一遍数据

batch 这个词本来的意思是啥?

英文词源解释:
  • batch 意思是“一批”、“一组”

  • 来自中古英语的 “bakken”(to bake),最早指“一炉烤好的面包”

 比如日常用法:

  • a batch of cookies(一批曲奇)

  • a batch of files(一组文件)

  • a batch of students(一批学生)

 所以在机器学习中借用这个词:

 把数据一组一组地送进去训练,就叫 batch!


总结对比:

参数名单词本意机器学习里的含义
epoch时代、纪元完整看一遍数据集epochs=50 训练 50 遍
batch一批、一炉、一组一次送入模型的样本数量batch_size=32 一次看 32 个样本

``` import torch import numpy as np from torch import nn, optim from torch.nn.utils.rnn import pad_sequence # 如果没有安装Jellyfish库,可以用其他方法处理序列 # 定义词典:单到索引映射,假设有5个不同的单 word_to_idx = { 'cat': 0, 'dog': 1, 'apple': 2, 'banana': 3, 'orange': 4 } # 加载训练数据测试数据,这里简单模拟,假设序列长度为5 training_data = [ ['cat', 'dog', 'apple'], ['banana', 'orange'], ['cat', 'dog', 'apple', 'banana'] ] test_data = [ ['apple', 'banana', 'orange'], ['dog', 'cat'] ] # 定义模型参数 batch_size = 2 seq_len = 5 hidden_size = 128 embedding_size = 100 class SimpleLSTM(nn.Module): def __init__(self, vocab_size, hidden_size, embedding_size): super().__init__() self.embedding = nn.Embedding(vocab_size, embedding_size) self.lstm = nn.LSTM(hidden_size, hidden_size, num_layers=1) self.fc = nn.Linear(hidden_size, hidden_size) def forward(self, x): # 假设x是 tensor形式,形状为 (batch_size, seq_len) x_embed = self.embedding(x) # 形状为 (batch_size, seq_len, embedding_size) lstm_out, (hn, cn) = self.lstm(x_embed) output = self.fc(hn.mean(dim=1)) # 取最后个时间步的输出 return output # 初始化模型 model = SimpleLSTM(len(word_to_idx), hidden_size, embedding_size) # 定义优化器 optimizer = optim.Adam(model.parameters(), lr=0.001) # 定义损失函数(交叉熵损失) criterion = nn.CrossEntropyLoss() # 训练循环 num_epochs = 10 for epoch in range(num_epochs): # 将数据转换为 tensors 并进行处理 train_sequences = [torch.tensor(s, dtype=torch.long) for s in training_data] train_labels = torch.tensor([0]*len(training_data), dtype=torch.long) sequences = pad_sequence(train_sequences, padding_value=9999) labels = torch.zeros(len(sequences)//seq_len * batch_size) # 前向传播 outputs = model(sequences[:, :seq_len]) loss = criterion(outputs, labels) # 反向传播优化 optimizer.zero_grad() loss.backward() optimizer.step() print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') # 测试模型 test_sequences = [torch.tensor(s, dtype=torch.long) for s in test_data] test_labels = torch.tensor([0]*len(test_data), dtype=torch.long) test_sequences_padded = pad_sequence(test_sequences, padding_value=9999) with torch.no_grad(): outputs = model(test_sequences_padded[:, :seq_len]) _, predicted = torch.max(outputs.data, 1) print("Test Accuracy:", np.mean(predicted == test_labels))```代码检查
最新发布
03-08
### Epoch与数据集划分的关系 在机器学习中,`epoch`是指整个训练集中所有样本被用来更新次模型参数的过程。对于不同阶段的数据集——即训练集、验证集测试集而言,这些集合的划分直接影响到模型的学习过程及其性能评估。 #### 训练集的作用及与Epoch的关系 训练集用于调整模型权重,在每次迭代期间通过反向传播算法最小化损失函数来优化网络结构。随着每个新的epoch到来,所有的训练样例都会再次参与计算并帮助改进模型的表现[^1]。 ```python for epoch in range(num_epochs): model.train() running_loss = 0.0 for inputs, labels in train_loader: optimizer.zero_grad() # 清除梯度 outputs = model(inputs) # 前向传递 loss = criterion(outputs, labels) loss.backward() # 反向传播 optimizer.step() # 更新参数 running_loss += loss.item() ``` #### 验证集的重要性及配置建议 为了防止过拟合现象的发生,通常会从原始数据集中分离出部分作为验证集。它不参与到实际的参数更新当中;相反地,在完成定数量epochs之后利用这部分未见过的数据去检验当前模型的好坏程度,并据此决定是否继续训练或是提前终止(early stopping)。此外还可以基于此选择最佳超参组合[^2]。 #### 测试集的角色定位 当完成了全部训练周期后,最终目的是要让构建好的预测器能够很好地泛化至未知实例上。因此有必要设立独立于前两者之外的个子集—测试集来进行最后的整体效能评测。值得注意的是在整个开发流程里该部分始终处于封闭状态直到项目结束才启用以确保公平公正性。 --- 关于如何合理设定上述三个分组的比例并没有固定标准,这取决于具体应用场景个人偏好等因素影响: - 对于大规模且高质量标注充足的场景下可以考虑7:1:2这样的比例分配; - 如果可用资源有限则可能倾向于采用k折交叉验证等方式替代固定的验证/测试切片从而提高利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值