【问题标题】:Triplet, Siamese and Softmax in TensorflowTensorflow 中的 Triplet、Siamese 和 Softmax
【发布时间】:2017-02-22 18:50:25
【问题描述】:

我想比较以下几种 CNN 对两个不同的大型图像数据集的性能。目标是测量两个图像之间的相似性,这两个图像在训练期间都没有见过。我可以使用 2 个 GPU 和 16 个 CPU 内核。

  1. 三元组 CNN(输入:三张图像,标签:按位置编码)
  2. 连体 CNN(输入:两张图片,标签:一张二值标签)
  3. 用于特征学习的 Softmax CNN(输入:一张图像,标签:一个整数标签)

对于 Softmax,我可以以二进制格式存储数据(顺序存储标签和图像)。然后用 TensorFlow 阅读器阅读。

要对 Triplet 和 Siamese 网络使用相同的方法,我必须提前生成组合并将它们存储到磁盘。这将导致创建文件所需的时间和磁盘空间的巨大开销。如何在运行中完成?

另一种简单的方法是使用 feed_dict,但这会很慢。因此,如果可以并行运行我将用于 feed_dict 的相同函数并将结果转换为 TensorFlow 张量作为最后一步,则问题将得到解决。但据我所知,这种转换不存在,因此必须首先使用 TensorFlow 阅读器读取文件,然后使用 TensorFlow 方法完成整个过程。这是正确的吗?

【问题讨论】:

  • 你能重新提出这个问题吗?
  • 当然可以,但是以哪种方式?

标签: python machine-learning tensorflow


【解决方案1】:

简短的回答是使用 numpy 在线创建对/三元组,无需将其转换为张量,因为 feed_dict 参数已经接受了 numpy 数组。

最好将现有批次中的tf.nn.embedding_lookup()itertools 结合使用来创建配对的索引,但对于一个简单的非最佳解决方案,您可以查看my github repository 中的 gen_batches_siamese.py 脚本.我在哪里重新实现了 caffe siamese 示例。 显然它比使用 tensorflow 队列效率低,但我的建议是在使用纯 tensorflow 解决方案之前先尝试这个基线。

【讨论】:

  • 您的解决方案能否针对机器 RAM 无法容纳的数据集进行扩展?
  • 实际上,您不必将内存映射与 numpy 或 Tensorflow 队列一起使用。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多