我试图在tensorflow中为我自己的自定义类别重新训练Inception v3模型。我已经下载了一些数据并将其格式化为目录。当我运行时,python脚本会为图像创建瓶颈,然后当它运行时,在第一个训练步骤(步骤0),它有一个严重错误,它尝试以0为模。它在计算时出现在get_image_path函数中mod_index,它是索引%len(category_list)所以category_list必须是0对吗?
为什么会发生这种情况,我该如何预防?
编辑:这是我在docker中看到的确切代码
2016-07-04 01:27:52.005912: Step 0: Train accuracy = 40.0%
2016-07-04 01:27:52.006025: Step 0: Cross entropy = 1.109777
CRITICAL:tensorflow:Category has no images - validation.
Traceback (most recent call last):
File "tensorflow/examples/image_retraining/retrain.py", line 824, in <module>
tf.app.run()
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 30, in run
sys.exit(main(sys.argv))
File "tensorflow/examples/image_retraining/retrain.py", line 794, in main
bottleneck_tensor))
File "tensorflow/examples/image_retraining/retrain.py", line 484, in get_random_cached_bottlenecks
bottleneck_tensor)
File "tensorflow/examples/image_retraining/retrain.py", line 392, in get_or_create_bottleneck
bottleneck_dir, category)
File "tensorflow/examples/image_retraining/retrain.py", line 281, in get_bottleneck_path
category) + '.txt'
File "tensorflow/examples/image_retraining/retrain.py", line 257, in get_image_path
mod_index = index % len(category_list)
ZeroDivisionError: integer division or modulo by zero
答案 0 :(得分:20)
<强>修正:强>
如果您的任何子文件夹中的图像数量较少,则会出现此问题。
当特定类别下的图片总数少于30时,我遇到同样的问题,请尝试增加图片数以解决问题。
<强>原因:强>
对于每个标签(子文件夹),tensorflow尝试创建3类图像(训练,测试和验证),并根据概率值(使用标签名称的散列计算)将图像置于其下。
仅当概率值小于类别(训练,测试或验证)大小时,图像才会放置在类别文件夹中。
现在,如果标签内的图像数量较少(例如25),则验证大小计算为10(默认值),概率值通常大于10,因此验证集中不会放置任何图像。
稍后当创建所有瓶颈并且tf正在尝试计算验证准确性时,它首先会抛出致命的日志消息:
CRITICAL:tensorflow:类别没有图像 - 验证。
然后继续执行代码并在尝试除以验证列表大小(为0)时崩溃。
答案 1 :(得分:12)
我已经修改了retrain.py以确保至少在验证中有图像(第201行*)
if len(validation_images) == 0:
validation_images.append(base_name)
elif percentage_hash < validation_percentage:
(*)行号可能会在将来的版本中更改。看看评论。
答案 2 :(得分:6)
我在运行retrain.py时遇到了同样的问题,当我错误地设置了--model_dir参数并且在flower_photos目录中创建了初始目录时。
请检查flower_photos目录中是否有任何目录没有任何图像。
答案 3 :(得分:4)
如果您的图像太少,就会发生这种情况。像Ashwin建议的那样,至少有30张图片。
您的文件夹名称也很重要。不知何故,您的文件夹名称不能有下划线(_)
例如。 这些名字不起作用:dettol_bottle,dettol_soap,dove_soap,lifebuoy_bottle
这些名字有用:dettolbottle,dettolsoap,dovesoap,lifebuoybottle
答案 4 :(得分:2)
我试图使用我自己的一组图像(狗的图片而不是花朵)进行训练,并遇到了同样的问题。
我发现问题最终导致我的文件夹名称(类别名称)没有出现在imagenet_synset_to_human_label_map.txt文件中,该文件被加载到我们正在修改的初始数据中。
通过将我的图像文件夹的名称从bichon更改为poodle,这开始工作,因为poodle位于起始地图中,而bichon不是。
答案 5 :(得分:1)
对我来说,此错误是由于培训目录中的文件夹中没有图像而引起的。我正在遵循相同的“诗人”教程,最终将带有子目录的目录放在图像目录中。一旦我删除了那些并且只放置了带有图像的目录(没有子目录),错误就不再发生了,我能够成功地训练我的模型。
答案 6 :(得分:1)
对我而言,这是一个&#34; - &#34;在我的文件夹名称中。我纠正它的那一刻,错误就消失了。
答案 7 :(得分:1)
正如Ashwin Patti所回答的那样,由于原始标签目录中缺少图像,验证的拆分目录可能没有图像。
当您尝试使用少于20张图像的标签进行重新训练时,警告支持此说明:
警告:文件夹少于20张图像,这可能会导致问题。
答案 8 :(得分:1)
在为每个类别添加&gt; 50张图片后,此错误消失了
答案 9 :(得分:0)
我还想添加自己的经验:
没有空格 对我来说,当包含的所有文件夹名称都是a到z字符,没有空格,没有符号,没有任何内容时,它都有效。
例如`我是一个文件夹'是错的。但是,'imAFolder'会起作用。
答案 10 :(得分:0)
Matthieu在评论中说,解决方案提出:
# make sure none of the list is empty, otherwise it will raise an error
# when validating / testing
if validation_percentage > 0 and not validation_images:
validation_images.append(training_images.pop())
if testing_percentage > 0 and not testing_images:
testing_images.append(training_images.pop())
对我而言。
我想知道消息是什么&#34;关键:tensorflow:类别没有图像 - 验证&#34;真正意思。它是否与修复的错误有关,或者可能意味着准确性的损失?我的意思是,如果使用的是少量图像,结果将不会如预期的那样?
答案 11 :(得分:-1)
我有这个完全相同的问题。我的文件夹命名正确,但是我的文件名为name_1.jpg,name_2.jpg。删除下划线可解决此问题。