Tensorflow子类化问题

问题描述

我有一个resnet模型,由以下类定义

class Modelresnet(tf.keras.models.Model):
    def __init__(self):
        super(Modelresnet,self).__init__()
        self.resBlock1 = ResBlock(num_filters=32)
        self.resBlock2 = ResBlock(num_filters=32)
        self.dense1 = tf.keras.layers.Dense(units=128,activation='relu')
        self.dense2 = tf.keras.layers.Dense(units=10,activation='softmax')

    def call(self,input_tensor,training=False):
        x = self.resBlock1(input_tensor,training=training)
        x = self.resBlock2(x,training=training)
        x = tf.keras.layers.Flatten()(x)

        # Option 1
        x = self.dense1(x)
        x = self.dense2(x)

        # Option 2
        # x = tf.keras.layers.Dense(units=128,activation='relu')(x)
        # x = tf.keras.layers.Dense(units=10,activation='softmax')(x)
        return x

当我调用Modelresnet2.fit()时,一切正常! 但是,如果在“调用方法中将Option1替换为Option2,则会出现以下错误

ValueError:tf.function-decorated函数试图在非首次调用时创建变量。 python-BaseException

不确定我了解问题的出处。 谢谢!

解决方法

呼叫时:

x = tf.keras.layers.Dense(units=128,activation='relu')(x)

您正在创建一个密集层,该层将立即被破坏(退出call()方法之后)。这没有道理-您将无法训练。

Tensorflow无法使用此类调用创建图层图。因此它禁止了他们。