Darkflow: 在训练过程中增加训练和验证的准确性

创建于 2017-05-30  ·  37评论  ·  资料来源: thtrieu/darkflow

培训期间:
step1 - 损失 240.92623901367188 - 移动平均损失 240.92623901367188
第 2 步 - 损失 241.2866668701172 - 移动平均损失 240.96228179931643
第 3 步 - 损失 239.79562377929688 - 移动平均损失 240.84561599731447

如何添加训练准确度和验证准确度?

step1 - 损失 240.92623901367188 - 移动平均损失 240.92623901367188 - 训练 0.221
第 2 步 - 损失 241.2866668701172 - 移动平均损失 240.96228179931643 - 训练 0.222
第 3 步 - 损失 239.79562377929688 - 移动平均损失 240.84561599731447 - 训练 0.223
完成 1 个 Epoch,验证 0.210

最有用的评论

是没有问题。 我会在这里上传文件。 如果你有任何问题,就问吧。

差异.zip

所有37条评论

有两种方法可以做到这一点。 您可以在代码中拆分训练中的数据集和验证集,或者只发送 2 个单独的数据集,一个用于训练,另一个用于在调用流模块时进行验证。

无论如何,为了做到这一点,您应该在 default.py 文件中添加一些新参数,然后修改 data.py(yolo 和 yolov2 文件夹)中的 _batch、parse 和 shuffle 函数并修改 flow.py 中的方法 train()文件(在这里,您只需使用相同的 tensorflow 会话运行另一批(每次迭代或多次迭代),但不返回 train_op,因此您不会修改权重)。 您还可以添加另一个 tf.summary.FileWriter 进行验证,以便您可以使用 tensorboard 可视化您的验证损失图。

我个人选择发送 2 个不同的数据集。 这是非常直接的。 我希望我说得够清楚了。

@Costyv95您能否与添加的参数和您建议的更改共享您的代码?

是没有问题。 我会在这里上传文件。 如果你有任何问题,就问吧。

差异.zip

@Costyv95验证集是否有助于您的实现中的梯度更新?

我明白了,验证样本对梯度更新没有贡献。

是的,验证仅用于在训练集之外预览模型结果。

你好,
对不起。 我没有注意到最后一封邮件。 是的,验证仅用于在训练集之外预览模型结果。

周二,2017年7月4日,下午三时16分24秒GMT + 3,yfliu [email protected]写道:

我明白了,验证样本对梯度更新没有贡献。


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看,或将线程静音。

@Costyv95我只想知道修改原始代码后如何运行它? 非常感谢!

@Costyv95我像这样运行它 ./flow --model cfg/yolo.cfg --train --dataset "/home/thinkjoy/lwl/modify-darkflow-master/data/VOCdevkit/VOC2007/JPEGImages" --annotation " /home/thinkjoy/lwl/modify-darkflow-master/data/VOCdevkit/VOC2007/Annotations" --gpu 1.0
这是错误(修改代码和你一样)
文件“/home/thinkjoy/lwl/modify-darkflow-master/darkflow/net/flow.py”,第 82 行,火车中
feed_dict[self.learning_rate] = lr
AttributeError: 'TFNet' 对象没有属性 'learning_rate'

发生这种情况是因为我给您的代码对自适应学习率进行了一些修改,您还需要做一些更改。 你可以在这里找到它: https :

并且您应该将 --val_dataset 和 val_annotation 添加到具有验证丢失的参数中。

@Costyv95我们可以控制一次验证多少步吗,我只是认为一步一个验证是浪费训练时间? 谢谢!

@ Costyv95你有没有在 val 时增加准确性?

@dream-will 对于 N 步验证一次,您可以轻松地在 defaults.py 和 flow.py 的 train 方法中添加一个参数(val_steps),您只需运行 if 语句中“#validation time”之后的代码像这样:

` #验证时间

if i % self.FLAGS.val_steps == 0:
    (x_batch, datum) = next(val_batches)
    feed_dict = {
        loss_ph[key]: datum[key] 
            for key in loss_ph }
    feed_dict[self.inp] = x_batch
    feed_dict.update(self.feed)
    feed_dict[self.learning_rate] = lr

    fetches = [loss_op, self.summary_op] 
    fetched = self.sess.run(fetches, feed_dict)
    loss = fetched[0]

    if loss_mva_valid is None: loss_mva_valid = loss
    loss_mva_valid = .9 * loss_mva_valid + .1 * loss

    self.val_writer.add_summary(fetched[1], step_now)

    form = 'VALIDATION step {} - loss {} - moving ave loss {}'
    self.say(form.format(step_now, loss, loss_mva_valid))`

在 defaults.py 中添加这一行:

self.define('val_steps', '1', 'evaluate validation loss every #val_steps iterations')

我不太明白关于增加准确性的第二个问题。

@ Costyv95感谢您的回答,第二个问题只是意味着当验证时,我们不仅得到验证损失,还得到验证准确度?

@dream-will 为此,您必须自己实现一个自定义准确度方法来比较 GT bboxes 和预测 bboxes(要获得预测 bboxes,请参阅预测中使用的代码),但我看不出原因,因为损失就够了。 请注意,您看到的验证仅在验证集中的随机小批量上进行,但这很好地代表了足够大的验证数据集上的测试损失。

@ Costyv95好的,谢谢

@Costyv95 。 我在输出 val 损失值时遇到问题。 我按照您的说明和代码修改了所有文件。 这是以下错误
File "flow", line 6, in <module> cliHandler(sys.argv) File "/home/alxe/ML/darkflow/darkflow/cli.py", line 26, in cliHandler tfnet = TFNet(FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/build.py", line 64, in __init__ self.framework = create_framework(*args) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 59, in create_framework return this(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 15, in __init__ self.constructor(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/yolo/__init__.py", line 20, in constructor misc.labels(meta, FLAGS) #We're not loading from a .pb so we do need to load the labels File "/home/alxe/ML/darkflow/darkflow/net/yolo/misc.py", line 36, in labels with open(file, 'r') as f: TypeError: coercing to Unicode: need string or buffer, NoneType found

你能打印文件变量的值吗?

@ Costyv95不,我不能。 这是我运行的:
python flow --model cfg/tiny-yolo-voc-1c.cfg --train --dataset train/images --annotation train/annotations --load bin/yolo.weights --gpu 1.0 --epoch 300

我所说的“文件变量”是指在 misc.py 中第 36 行使用的变量,因为我无法真正理解您的代码有什么问题。
你没有任何 --val_dataset 参数? 你是如何实施改变的? 您在代码中拆分数据集还是添加了 --val_dataset 参数?

@ Costyv95嗨,我已将您的文件复制并粘贴到 diff.zip 上,然后我尝试使用命令进行训练

"flow --train --model ./coke/yolo-coke-2c.cfg --annotation ./coke/train/annotations --dataset ./coke/train/images --gpu 1.0 --batch 8 --save 1000 --val_dataset ./coke/validation/images --val_annotation ./coke/validation/annotations

但它仍然出错
`
[ nkhanh@localhost khanh]$ ./run_coke.sh

解析 ./coke/yolo-coke-2c.cfg
正在加载 无 ...
在 0.0001392364501953125s 内完成
回溯(最近一次调用最后一次):
文件“/usr/local/bin/flow”,第 6 行,在
cliHandler(sys.argv)
cliHandler 中的文件“/usr/local/lib64/python3.6/site-packages/darkflow/cli.py”,第 26 行
tfnet = TFNet(标志)
文件“/usr/local/lib64/python3.6/site-packages/darkflow/net/build.py”,第 64 行,在 __init__ 中
self.framework = create_framework(*args)
文件“/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py”,第 59 行,在 create_framework
返回这个(元,标志)
文件“/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py”,第 15 行,在 __init__ 中
self.constructor(元,标志)
构造函数中的文件“/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/__init__.py”,第 20 行
misc.labels(meta, FLAGS) #我们不是从 .pb 加载,所以我们需要加载标签
文件“/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/misc.py”,第36行,标签中
with open(file, 'r') as f:
类型错误:预期的 str、bytes 或 os.PathLike 对象,而不是 NoneType
`

@khanh1412
在 misc.py line29
将其更改为您的自定义标签文件。
文件 = '标签.txt'

PS 这是一个临时解决方案。

@Costyv95
如何理解删除“[”和“]”?

进入训练...
回溯(最近一次调用最后一次):
文件“流”,第 6 行,在
cliHandler(sys.argv)
cliHandler 中的文件“/Users/sisyphus/darkflow/darkflow/cli.py”,第 33 行
print('进入训练...'); tfnet.train()
文件“/Users/sisyphus/darkflow/darkflow/net/flow.py”,第 54 行,火车中
arg_steps = self.FLAGS.steps[1:-1] # 删除 '[' 和 ']'
TypeError: 'NoneType' 对象不可下标

@Costyv95

我应该在哪里添加 tf.summary.FileWriter 进行验证以使用张量板可视化验证损失图。

谢谢

@ Costyv95我试过你的 zip 文件 diff.zip。 但是终端告诉我 --val_dataset 是一个无效的参数。 我需要更改其他文件吗?

@ Costyv95我试过你的 zip 文件 diff.zip。 但是终端告诉我 --val_dataset 是一个无效的参数。 我需要更改其他文件吗?

您应该替换包括 yolo-data 和 yolov2-data 在内的所有文件。 您应该简单地分别复制并粘贴到相关文件夹中,只需通过“数据”更改它们的名称即可简单地更改其中的文件。

@khanhhh
在“darkflow\defaults.py”中的“def setDefaults(self):”中添加一段代码“self.define('labels', 'labels.txt', 'path to labels file')”,然后就可以使用“ --labels xxx.txt”如前。

太感谢了!!!!!!!!

2019 年 5 月 25 日凌晨 3 点 11 分,Jack通知@github.com 写道:

@KhanhHH https://github.com/KhanhHH
在“darkflow\defaults.py”中的“def setDefaults(self):”中添加一段代码“self.define('labels', 'labels.txt', 'path to labels file')”,然后就可以使用“ --labels xxx.txt”如前。


您收到此消息是因为您发表了评论。
回复此电子邮件直接,查看它在GitHub上https://github.com/thtrieu/darkflow/issues/264?email_source=notifications&email_token=AEIP7DOZYIFBYZHV22RVIADPXD7ELA5CNFSM4DNH2ANKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWHLNQQ#issuecomment-495892162 ,或静音线程https://github.com/notifications/取消订阅身份验证/AEIP7DPOGFQ2EYSSZFPZSL3PXD7ELANCNFSM4DNH2ANA

@Costyv95
您好,我想知道如何在“darkflow\defaults.py”中设置路径“gs://bucket_hand_detection_2”? 我的 python(3.7) 找不到这个路径,它抛出错误; “桶”代表什么剂量?

@Costyv95
您好,我想知道如何在“darkflow\defaults.py”中设置路径“gs://bucket_hand_detection_2”? 我的 python(3.7) 找不到这个路径,它抛出错误; “桶”代表什么剂量?

同样的错误,但检查点正常保存,所以我不知道这是什么错误@Costyv95

谢谢@Costyv95!

嗨, @Costyv95 Yolo 训练并输出验证损失,但在 1000 步后它会抛出错误。 文件 FileNotFoundError:[Errno 2] 没有这样的文件或目录:“gsutil”:“gsutil”。

错误:
error

@akmeraki您好,我遇到了同样的问题,您是否找到了有关此错误的任何解决方案?

@zhe0503 @akmeraki我希望这还不算太晚,但我所做的只是输入“pip install gsutil”,它解决了问题!!

大家好。
如果我想获得整个训练模型的准确性,我需要做什么?
例如,我正在训练我的模型,并在某个时候停止训练。 现在我有了最后一个保存的检查点,我想计算到最后一个检查点的准确度。
cpkt 文件夹中的文件被命名为,

检查站
yolo-new-50.data-00000-of-00001
yolo-new-50.index
yolo-new-50.meta
yolo-new-50.profile

我将不胜感激帮助家伙。

@Costyv95
我仔细遵循了您的指示,但 train.py 似乎无法识别 --val_... 参数。 你能帮我吗? 错误如下:
错误 - 无效参数:--val_dataset

发生这种情况是因为我给您的代码对自适应学习率进行了一些修改,您还需要做一些更改。 你可以在这里找到它: 124d55d

并且您应该将 --val_dataset 和 val_annotation 添加到具有验证丢失的参数中。

它对我不起作用。 我收到如下错误:
错误 - 无效参数:--val_dataset

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

wendq86 picture wendq86  ·  23评论

loretoparisi picture loretoparisi  ·  18评论

borasy picture borasy  ·  18评论

lesthad666 picture lesthad666  ·  38评论

philipperemy picture philipperemy  ·  41评论