CRITICAL:tensorflow:类别没有图像 - 验证

时间:2016-07-04 00:59:50

标签: python machine-learning tensorflow

我试图在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

12 个答案:

答案 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)

  1. 如果您的图像太少,就会发生这种情况。像Ashwin建议的那样,至少有30张图片。

  2. 您的文件夹名称也很重要。不知何故,您的文件夹名称不能有下划线(_)

  3. 例如。 这些名字不起作用: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。删除下划线可解决此问题。