gpt4 book ai didi

tensorflow - 在 TensorFlow 中微调 Inception 模型

转载 作者:行者123 更新时间:2023-12-03 16:27:03 26 4
gpt4 key购买 nike

我想在我自己的数据集上使用预训练的 Inception 模型,并且我还想微调 Inception 模型本身的变量。

我已经从以下链接下载了 TensorFlow 的预训练 Inception 模型:

http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz

我按如下方式加载 Inception 模型:

graph = tf.Graph()
with graph.as_default():
with tf.gfile.FastGFile('classify_image_graph_def.pb', 'rb') as file:
graph_def = tf.GraphDef()
graph_def.ParseFromString(file.read())
tf.import_graph_def(graph_def, name='')

(关于 API 的附注:如果我可以写 graph = tf.load_graph('inception.pb') 而不是这六个嵌套和复杂的行,那就太好了。)

然后我得到对 Inception 模型中 softmax 分类器之前最后一层的张量的引用:
last_layer = graph.get_tensor_by_name('pool_3:0')

现在我想在图中添加一个新的 softmax 分类器,这样我就可以训练新的 softmax 分类器并训练 Inception 模型中的部分或全部变量。这就是我所理解的微调,而不是迁移学习,只有新的 softmax 分类器在我自己的数据集上进行训练。

然后我使用 PrettyTensor 附加新的 softmax 分类器(注意 y_true 是一个占位符变量):
with pt.defaults_scope(activation_fn=tf.nn.relu):
y_pred, loss = pt.wrap(last_layer).\
flatten().\
softmax_classifier(class_count=10, labels=y_true)

但这会给出一个很长的错误消息,最后一部分显示为:
ValueError: Tensor("flatten/reshape/Const:0", shape=(2,), dtype=int32) must be from the same graph as Tensor("pool_3:0", shape=(1, 1, 1, 2048), dtype=float32).

所以我显然不允许像这样组合两个图表。

我也尝试过使用 reshape()而不是 flatten()如下(注意Inception模型的最后一层有2048个特征):
with pt.defaults_scope(activation_fn=tf.nn.relu):
y_pred, loss = pt.wrap(last_layer).\
reshape([-1, 2048]).\
softmax_classifier(class_count=10, labels=y_true)

但这给出了几乎相同的错误:
ValueError: Tensor("reshape/Const:0", shape=(2,), dtype=int32) must be from the same graph as Tensor("pool_3:0", shape=(1, 1, 1, 2048), dtype=float32).

我也尝试将它包装在 graph.as_default() 中像这样:
with graph.as_default():
with pt.defaults_scope(activation_fn=tf.nn.relu):
y_pred, loss = pt.wrap(last_layer).\
reshape([-1, 2048]).\
softmax_classifier(class_count=10, labels=y_true)

但这给出了类似的错误:
ValueError: Tensor("ArgMax_1:0", shape=(?,), dtype=int64) must be from the same graph as Tensor("cross_entropy/ArgMax:0", shape=(1,), dtype=int64).

我将如何对 Inception 模型进行微调?我想添加一个新的 softmax 分类器,并且我想微调 Inception 模型本身中的部分或全部变量。

谢谢!

编辑:

我对这个问题有部分解决方案。

错误消息是因为我没有将所有代码放入 with graph.as_default():堵塞。将所有代码放入该 block 中可修复错误消息,我现在可以使用 PrettyTensor 将新的 softmax 层附加到 Inception 模型,如上所述。

但是,Inception 模型显然是一个“卡住”图,这意味着所有变量在保存之前都已转换为常量。

所以我现在的问题是,我是否可以以某种方式“解冻”初始模型的图形,以便继续训练其图形的部分或全部变量?我该怎么做?

还是应该改用新的 MetaGraph 功能?

https://www.tensorflow.org/versions/r0.11/how_tos/meta_graph/index.html

我在哪里可以下载 Inception 模型的预训练 MetaGraph?

最佳答案

我也有完全相同的问题。首先你可以根据这个微调整个网络:https://github.com/tensorflow/models/tree/master/inception#adjusting-memory-demands
我想出了如何在我自己的数据集上实现这个代码。问题是我想微调整个网络,然后用新的卷积层和 softmax 替换最后 2 个初始模块。但是,我认为如果我进行整个微调,那么我需要恢复权重直到第 8 个初始模块并只训练新层,但这不能仅通过 tensorflow 的恢复功能来实现。另一个好技巧在这里:https://www.tensorflow.org/versions/r0.9/how_tos/image_retraining/index.html
您可以从 .pb 文件中获取预训练网络,但这仅适用于根据 tensorflow 进行的迁移学习。我想到的唯一解决方案是对整个网络进行微调,然后将其导出到 .pb 文件,以便将微调的权重带到我想要的层,但我无法实现这一点。通常 tensorflow 并不清楚我们如何做到这一点。我也会在 git 上发布一个问题。如果有人确切知道我们可以做什么,请回答。

关于tensorflow - 在 TensorFlow 中微调 Inception 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com