【发布时间】:2016-09-05 10:12:09
【问题描述】:
我使用从 Caffe zoo 下载的预训练网络权重在 tensorflow 中构建特征提取器 (VGG-16)。
因此,我使用导入的权重作为常量重新定义了 TF 中的网络架构,并添加了一个额外的带有 tf.Variables 的全连接层,以通过 SGD 在铰链损失成本上训练线性 SVM。
我的初始训练集由 100000 个 32x32x3 图像组成,以 numpy 数组的形式。 因此,我不得不将它们调整为 224x224x3,这是 VGG 的输入大小,但不适合内存。
所以我删除了不必要的示例并将其缩小到 10000x224x224x3 图像,这很糟糕但仍然可以接受,因为只有支持向量很重要,但即便如此我仍然在训练时使用 TF 得到 OOM。
这不应该是这种情况,因为唯一重要的表示是来自倒数第二层的大小为 4096 的表示,它很容易管理,并且反向传播的权重只有大小 (4096+1bias)。
所以我能做的就是首先将我所有的图像转换为只有常数的 TF 网络的特征,形成一个 10000x4096 的数据集,然后训练第二个 tensorflow 模型。 或者在每个批次重新计算批次的所有特征。在 next_batch 方法中。或者使用 TF 提供的大量缓冲区/队列运行器,但这有点吓人,因为我不太熟悉这些。
我不喜欢那些我认为应该有更优雅的方法(如果可能的话不要太多队列)。
处理这个问题的最符合 TensorFlow 的方法是什么?
【问题讨论】:
-
您的图像非常小,将它们放大这么多没有多大意义,在它们上训练网络可能会更好(甚至是自动编码器)。
-
@Matias Valdenegro 你说得有道理。不幸的是,我试图从头开始训练一个网络(实际上是几个网络),但由于各种原因,它被证明不如我预期的那么有效。这就是我想尝试迁移学习的原因。
-
您需要从使用类似大小图像的网络进行迁移学习。 32x32 彩色图像应该不难训练到可接受的精度(例如 70-80% 或更高),特别是对于您拥有的数据量。在 CIFAR-10/100 数据集上训练的网络可以工作得更好。
-
即使调整大小看起来有点牵强,我实际上仍然希望 Imagenet 训练的网络能够更好地工作(也许我会弄错?)但当然你也是对的,我也会尝试使用 CIFAR。但是,这并不能回答我的问题。
-
你是对的,解决方案只是一次加载一批图像(32个左右),但我不知道具体如何在TensorFlow中做到这一点。
标签: out-of-memory tensorflow deep-learning