python3 RuntimeError: dictionary changed size during iteration

本文介绍了如何在Python中避免在遍历字典时修改字典导致的运行时错误。针对Python 2与Python 3的不同特性,给出了两种解决方法:Python 2中可以直接迭代字典的keys;而Python 3中需要先将keys转为列表再进行迭代。

python3 RuntimeError: dictionary changed size during iteration

python2
keys 先对字典进行 copy,从而在修改字典时,也能进行迭代

headerTable = {}
minSup = 1 
for k in headerTable.keys():
    if headerTable[k] < minSup:
        del(headerTable[k])

python3
Python 3.x 的 keys 返回的是iterator 而非列表,导致当修改字典时,无法迭代。所以,可以使用list 强制将字典进行copy,转换成列表。

headerTable = {}
minSup = 1 
for k in list(headerTable):
    if headerTable[k] < minSup:
        del(headerTable[k])

How to avoid “RuntimeError: dictionary changed size during iteration” error?

### 含义 - **Batch**:使用训练集的部分数据对模型进行一次训练和反向传播参数更新。它是训练过程中一组样本的集合,用于同时输入到模型中进行计算。而每个批次中样本的数量就是 batch size[^1]。 - **Iteration**:使用一个 batch 的数据对模型进行参数更新的过程,即 1 个 iteration 等于使用 batch size 个样本训练一次[^1][^2]。 ### 作用 - **Batch**: - 有效利用硬件资源,减少内存使用量。在处理大规模数据时,如果一次性将所有数据输入到模型中,可能会导致内存不足,而将数据分成批次可以避免这个问题。 - 引入一定的随机性,有助于模型更好地泛化。不同批次的数据组成不同,使得模型在每次迭代中面对的数据分布有一定变化,从而避免模型对特定数据的过拟合。 - 影响模型的收敛速度和精度。batch size 越大,模型的训练速度通常越快,但也可能会陷入局部最优;batch size 越小,训练所花费的时间越长,但模型训练时梯度下降的随机性越强,有更大可能跳过鞍点避免陷入局部最优,但也会扩大训练数据噪声对模型预测效果的影响[^2][^3]。 - **Iteration**:是模型进行参数更新的基本操作单元,通过多次 iteration 逐步调整模型的参数,使模型不断学习数据中的特征和模式,从而提高模型的性能。 ### 关系 要完成一个 epoch(将训练集中的全部样本训练一次),需要进行的 iteration 次数等于训练集样本数除以 batch size(即 number of batches),也就是说,想要训练完 1 个 epoch,起码需要 epoch / batch sizeiteration[^1][^2]。例如,训练集有 1000 个样本,batch size 为 100,则一个 epoch 包含 1000 / 100 = 10 个 iteration。 以下是一个简单的 Python 代码示例,展示了 batch 和 iteration 的概念: ```python import numpy as np # 假设训练数据集 train_data = np.random.rand(1000, 10) # 1000个样本,每个样本有10个特征 train_labels = np.random.randint(0, 2, 1000) # 1000个标签 # 批次大小 batch_size = 100 # 轮数 epochs = 5 for epoch in range(epochs): num_batches = len(train_data) // batch_size for iteration in range(num_batches): start_idx = iteration * batch_size end_idx = start_idx + batch_size batch_data = train_data[start_idx:end_idx] batch_labels = train_labels[start_idx:end_idx] # 这里可以进行模型的训练操作,例如调用模型的训练函数 # model.train(batch_data, batch_labels) print(f"Epoch {epoch + 1}, Iteration {iteration + 1}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值