我有一个Keras模型,它由不同的层组成。其中一层实际上是另一个完整的模型。当该层模型为VGG16时,我可以训练uber模型。这是模型。摘要()
当我简单地换掉VGG16,换上EfficientNetB0(一款小得多的车型!),我就不能再训练uber车型了。这是模型。摘要()
“啊,”你说,“一些可训练的重量,一些记忆中的梯度,一些东西。”
好的,当然可以。让我们收缩和/或核化一组层,以便将可训练权重降低到VGG16版本以下。这么做之后,我仍然无法训练uber模型!这是模型。摘要()
为什么我不能训练占总重量30%和可训练重量25%的更小模型
示例代码:
img = Input(shape = (224,224,3))
# ^ Don't reuse img= or Tensorflow will break!
x = BatchNormalization()(img)
x = Efnet(x)
# x = Vgg16(x)
x = Activation('linear')(x)
# ^ Don't remove pass through or Tensorflow will break!
x = GeneralizedMeanPool2D(x)
x = NormActDrop(x)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = Dense(1)(x)
model = Model(inputs = img, outputs = x)
model.summary()
自定义块与您想象的一样简单,例如:
def NormActDrop(x, activation_function = mish, dropout_rate = 0.2):
x = BatchNormalization()(x)
x = Activation(activation_function)(x)
x = Dropout(dropout_rate)(x)
return x
根据您使用的Tensorflow版本和报告的错误,可能会有很多答案。我在过去发现的一个答案是,对于某些模型,如果将
allow_growth
参数设置为False
,则该模型将在GPU中运行。您可以尝试将其设置为True
See this stack overflow question and answer for more details
不过,像这样的事情可能会奏效
让我知道这是否有帮助。一般来说,请发布有关问题的更多详细信息(可复制代码、堆栈跟踪等)
相关问题 更多 >
编程相关推荐