问题标签 [vgg-net]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1585 浏览

tensorflow - 在 Keras 中微调 VGG-16 慢速训练

我正在尝试使用 LFW 数据集微调 VGG 模型的最后两层,我已经通过删除原始层并在我的情况下添加具有 19 个输出的 softmax 层来更改 softmax 层尺寸,因为我有 19 个类我正在努力训练。我还想微调最后一个全连接层,以制作“自定义特征提取器”

我正在设置我希望不可训练的图层,如下所示:

使用 gpu,我每个 epoch 需要 1 小时来训练 19 个类,每个类至少 40 个图像。

由于我没有很多样本,所以这种训练表现有点奇怪。

任何人都知道为什么会这样?

这里的日志:

结果不好,因为我无法训练它以获得更多数据,因为它需要太长时间。任何的想法?

0 投票
3 回答
16197 浏览

python - Keras VGG16 微调

keras 博客上有一个 VGG16 微调的例子,但我无法重现。

更准确地说,这里是用于在没有顶层的情况下初始化 VGG16 并冻结除最顶层之外的所有块的代码:

接下来,创建一个具有单个隐藏层的顶级模型:

请注意,它之前接受过瓶颈功能的训练,如博客文章中所述。接下来,将此顶层模型添加到基本模型并编译:

最终,适合猫/狗数据:

但这是我在尝试拟合时遇到的错误:

ValueError:检查模型目标时出错:预期 block5_maxpool 有 4 > 维,但得到的数组形状为 (16, 1)

因此,基础模型中的最后一个池化层似乎有问题。或者可能我在尝试将基本模型与顶部模型连接时做错了。

有没有人有类似的问题?或者也许有更好的方法来构建这种“连接”模型?我正在使用keras==2.0.0后端theano

注意:我使用的是 gist 和applications.VGG16实用程序中的示例,但是在尝试连接模型时遇到了问题,我对keras功能 API 不太熟悉。所以我在这里提供的这个解决方案是最“成功”的一个,即它只在拟合阶段失败。


更新#1

好的,这是关于我正在尝试做的事情的一个小解释。首先,我从 VGG16 生成瓶颈特征如下:

然后,我创建了一个顶级模型并在这些特征上对其进行训练,如下所示:

所以基本上,有两个经过训练的模型,base_model一个是 ImageNet 权重,一个top_model是从瓶颈特征生成的权重。我想知道如何连接它们?有可能还是我做错了什么?因为正如我所看到的,来自@thomas-pinetz 的响应假设顶级模型没有单独训练并立即附加到模型。不确定我是否清楚,这是博客的引述:

为了进行微调,所有层都应该从经过适当训练的权重开始:例如,您不应该在预训练的卷积基础上随机初始化全连接网络。这是因为由随机初始化的权重触发的大梯度更新会破坏卷积基中的学习权重。在我们的例子中,这就是为什么我们首先训练顶级分类器,然后才开始微调卷积权重。

0 投票
1 回答
245 浏览

python-2.7 - 微调 vgg 引发内存错误

嗨,我正在尝试针对我的问题微调vgg,但是当我尝试训练网络时,我得到了这个错误。

使用形状分配张量时出现 OOM[25088,4096]

网络有这样的结构:

在此处输入图像描述

我从这个站点获取这个tensorflow 预训练的 vgg 实现 代码

我只添加这个程序来训练网络:

我尝试将批量大小减少到 2 但不起作用我得到同样的错误。该错误是由于无法在内存中分配的大张量。如果我在没有最小化网络的情况下提供一个值,我只会在火车上得到这个错误。我怎样才能避免这个错误?如何节省显卡内存(Nvidia GeForce GTX 970)?

更新:如果我使用GradientDescentOptimizer训练过程开始,而不是如果我使用AdamOptimizer我得到内存错误,似乎 GradientDescentOptimizer 使用更少的内存。

0 投票
3 回答
18023 浏览

python - Keras - 所有图层名称都应该是唯一的

我将 keras 中的两个 VGG 网络组合在一起进行分类任务。当我运行程序时,它显示一个错误:

RuntimeError:名称“预测”在模型中使用了 2 次。所有图层名称都应该是唯一的。

我很困惑,因为我prediction在代码中只使用了一次层:

感谢@putonspectacles 的帮助,我按照他的指示找到了一些有趣的部分。如果model2.layers.pop()将两个模型的最后一层用“ model.layers.keras.layers.concatenate([model1.output, model2.output])”组合起来,你会发现最后一层信息还是用model.summary(). 但实际上它们并不存在于结构中。因此,您可以使用model.layers.keras.layers.concatenate([model1.layers[-1].output, model2.layers[-1].output]). 它看起来很棘手,但它确实有效。我认为这是关于日志和结构同步的问题。

0 投票
3 回答
4039 浏览

python - II 如何用现有模型的值初始化 slim.conv2d() 中的权重

slim.conv2d用来设置 VGG-net

如果我想初始化现有 VGG 模型的变量conv1conv2来自现有 VGG 模型的变量。

我该怎么做?

0 投票
1 回答
4058 浏览

python - VGG,keras 中的感知损失

我想知道是否可以将自定义模型添加到 keras 的损失函数中。例如:

这是一个简化的例子。我实际上会在损失中使用 VGG 网络,所以只是想了解 keras 的机制。

0 投票
2 回答
1087 浏览

tensorflow - 正向运行时如何从 tensorflow slim 模型 VGG 中提取特征?

我已经使用 TensorFlow slim 模型 vgg 训练了一个分类模型,使用 CASIA(人脸识别数据集)作为训练数据集。我想通过使用 LFW 数据集来测试模型,这是一个人脸匹配任务。所以我需要提取像fc7/fc8这样的网络特征,而不是softmax层,并比较特征之间的距离,以确定它们是否是同一个人。如何提取苗条模型的特征?

这是训练代码的一部分。

0 投票
1 回答
1219 浏览

keras - 如何使用来自 VGG-16 的预训练特征作为 Keras 中 GlobalAveragePooling2D() 层的输入

是否可以使用来自 VGG-16 的预训练模型特征并传递到 Keras 中其他模型的 GlobalAveragePooling2D() 层?

VGG-16网络离线特征存储示例代码:

顶级模型的示例代码:

我不能使用 Flatten() 层,因为我想预测具有多类的多标签。

0 投票
1 回答
1079 浏览

python - Keras VGGnet 预训练模型可变大小输入

我想使用 VGG 预训练模型提取 368x368 大小的图像的特征。根据文档,VGGnet 接受 224x224 大小的图像。有没有办法给 Keras VGG 提供可变大小的输入?

这是我的代码:

编辑后的代码(有效!)

0 投票
0 回答
179 浏览

keras - 重新训练 VGG 16 的密集层时的内存问题

我想使用带有 Then 后端的 Keras 重新训练 VGG 16 的全连接层以获得大灰度图像 (​​1800x1800)。

所以我有:

  • 创建一个具有单一颜色通道的新 VGG,并从原始 VGG 加载权重。
  • 将 trainable=False 添加到所有卷积层(根据定义,池化和填充不可训练)
  • 删除前两个密集层以仅保留具有两个神经元的输出层
  • 大幅增加最大池尺寸和步幅,因为我使用 1800x1800 的输入(别无选择)。尺寸下降很快以匹配原始 VGG 尺寸。
  • 减少批量大小以减少所需的内存。

但是当我开始训练时,我遇到了 CNMEM_STATUS_OUT_OF_MEMORY 错误。我使用 NVIDIA K40,所以我有 12Go 的内存。

知道如何解决吗?