【问题标题】:Getting Output Tensor from Frozen Layers从冻结层获取输出张量
【发布时间】:2020-05-19 20:08:43
【问题描述】:

我正在使用迁移学习训练网络。我目前冻结了前 70 层,并且只在最后 10 层进行训练。由于我的数据集的大小,每个 epoch 需要 45 分钟来训练。如果有办法,我想在整个网络上训练 1 个 epoch,得到最后一个冻结层的输出张量,并将其输入到训练层中,以确定需要多少个 epoch。

我希望这将减少训练网络所需的时间,因为本质上是跳过了常量层。

from tensorflow.keras.applications import MobileNet
from tensorflow.keras.models import Model

base_model = MobileNet(weights='imagenet', include_top=False, input_shape=(224,224,3), dropout=.2)

x = base_model.output
x = Dense(10, activation='softmax')(x)
model = Model(inputs=base_model.input,outputs=x)

for layer in model.layers[:70]:
    layer.trainable=False
for layer in model.layers[70:]:
    layer.trainable=True
...

我使用 ImageDataGenerator 将我的数据导入网络。

这是我正在关注的教程:https://towardsdatascience.com/transfer-learning-using-mobilenet-and-keras-c75daf7ff299

【问题讨论】:

  • 对不起,你能告诉我,你为什么需要这个?你认为它会提高火车速度吗?
  • 是的。这就是目标

标签: python tensorflow keras transfer-learning


【解决方案1】:

当您将trainable = False 设置为层时,模型不会花时间训练这些层。默认情况下会跳过不可训练的层。

如果你想提高速度,让更多的层不可训练。

您也有可能在 CPU 上训练模型,这比在 GPU 上训练要慢得多

【讨论】:

  • 我已经在 GPU 上进行训练了。当 trainable=False 时,张量仍然通过冻结层馈送,因此计算完成。它们每次都会产生相同的值。我希望避免进行这些计算
  • 怎么想,正在做什么样的计算?图层被冻结。冻结层仅用于可训练层的数据预处理。你无法避免这种情况。
  • 据我了解,第一个解冻层接收一个由所有冻结层生成的张量。我知道他们的权重是冻结的,但他们仍然会计算一些东西。如果数据跳过了冻结层,那么第一个未冻结层中的尺寸或形状将不正确
  • 您将这些冻结层用作预处理。这是他们做的唯一计算。如果您想摆脱这种计算,请删除图层。这就是迁移学习的工作原理。您不能只为没有冻结层的未冻结层计算冻结层
  • 我知道它们是用于预处理的。我希望通过仅在冻结层中运行一个时期并获取其输出张量并仅通过未冻结层运行该输出张量来减少计算时间,以训练网络需要多少个时期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2019-08-27
  • 2016-06-29
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多