TensorFlow训练代码报错:not enough values to unpack (expected 2, got 0)求助
解决
not enough values to unpack (expected 2, got 0)错误 这个错误的根源很明确——你在执行batch_images, batch_labels = map(list, zip(*batch))时,当前循环的batch是空的(没有任何样本数据),导致zip(*batch)返回了一个空的迭代器,尝试把它解包成两个变量自然就失败了。
为什么会出现空批次?
大概率是你的total_batch列表中混入了空的批次数据,可能是数据加载/分批次的逻辑出了问题:比如自定义数据生成器偶尔返回空结果,或者手动分批次时最后一个批次没有处理好(比如原数据长度刚好是批次大小的整数倍,但代码逻辑错误生成了空批次)。
解决方案
我给你几个逐步解决的思路:
先跳过空批次,保证代码能运行
在循环里先判断当前批次是否为空,直接跳过它,避免报错:for batch in total_batch: if not batch: # 检查批次是否为空 continue # 后续的批次处理代码 batch_images, batch_labels = map(list, zip(*batch)) # ...修复数据分批次的逻辑
找到生成total_batch的代码,确保它不会产生空批次。比如如果是手动拆分数据:# 假设你的原始数据是包含(image, label)元组的列表data batch_size = 32 # 用这种方式分批次,最后一个批次即使样本数不足batch_size也不会为空 total_batch = [data[i:i+batch_size] for i in range(0, len(data), batch_size)]如果是用数据生成器,检查生成器的逻辑,确保每次
yield的批次至少包含一个样本。添加调试信息定位问题
可以在循环里打印每个批次的长度,方便你找到到底哪个批次是空的,进而排查数据来源的问题:for epoch in range(training_epochs): for batch_idx, batch in enumerate(total_batch): print(f"Epoch {epoch}, Batch {batch_idx}: {len(batch)} samples") if not batch: print(f"Found empty batch at index {batch_idx}!") continue # 后续处理代码
修改后的完整代码示例
结合你的代码,调整后如下:
with tf.Session() as sess: ## Initialize the variables sess.run(tf.global_variables_initializer()) for epoch in range(training_epochs): for batch_idx, batch in enumerate(total_batch): # 跳过空批次 if not batch: print(f"Skipping empty batch {batch_idx} in epoch {epoch}") continue batch_images, batch_labels = map(list, zip(*batch)) batch_images = np.array(batch_images) batch_labels = np.array(batch_labels).reshape(-1, 1) ## Run the training procedures _, l, acc = sess.run([optimizer, loss, accuracy], feed_dict={x: batch_images, y: batch_labels}) if epoch % display == 0: print('\nEpoch: %d, Loss: %f, Accuracy: %f' % (epoch + 1, l, acc))
内容的提问来源于stack exchange,提问作者Saurabh Singh
相关产品推荐
相关产品推荐

