Erreur de la fonction décorée par tf.function lors de la tentative de création de variables lors d'un autre appel. Dans tensorflow.keras

Il a tendance à se boucher parfois, donc dans un mémorandum

Partie d'erreur

class ResNet50(Model):
    def __init__(self, stride: int = 1, *args, **kwargs):
        super(ResNet50, self).__init__(*args, **kwargs)
        self.stride = stride
        self.avgpool = AveragePooling2D()
        self.maxpool = MaxPool2D(padding='same')
        self.ResBlocks: List[Layers] = [] 
        
        self.softmax = Softmax()
        self.dense = Dense(1, activation='sigmoid')

    def call(self, inputs):
        conv_1 = self.conv(inputs)
        maxpooled = self.maxpool(conv_1)
        layers_num = [3, 4, 6, 3]
        for i in range(len(layers_num)):
            for _ in range(layers_num[i]):
                if i==0 and u==0:
                   self.ResBlocks.append(Residual_Block(filters_num=4 * 2 ** (i))(maxpooled))
                else:
                self.ResBlocks.append(Residual_Block(filters_num=4 * 2 ** (i))(self.ResBlocks[-1])))
        
        avgpooled = self.avgpool(maxpooled)
        value = self.dense(avgpooled)
        return avgpooled, value

J'ai fait quelque chose comme ça et j'ai eu une fonction décorée de tf.function qui a essayé de créer des variables sur le non-premier appel. Si vous le recherchez, la variable de déclaration tensorflow sera nouvellement déclarée.

Après résolution

class ResNet50(Model):
    def __init__(self, stride: int = 1, *args, **kwargs):
        super(ResNet50, self).__init__(*args, **kwargs)
        self.stride = stride
        self.avgpool = AveragePooling2D()
        self.maxpool = MaxPool2D(padding='same')
        self.ResBlocks: List[Layers] = [] 
        layers_num = [3, 4, 6, 3]
        for i in range(len(layers_num)):
            for _ in range(layers_num[i]):
                self.ResBlocks.append(Residual_Block(filters_num=4 * 2 ** (i)))
        self.conv = Conv2D(filters=16, kernel_size=7, strides=self.stride, padding='same')
        self.softmax = Softmax()
        self.dense = Dense(1, activation='sigmoid')
    def call(self, inputs):
        conv_1 = self.conv(inputs)
        maxpooled = self.maxpool(conv_1)
        for layer in self.ResBlocks:
            maxpooled = layer(maxpooled)
        avgpooled = self.avgpool(maxpooled)
        value = self.dense(avgpooled)
        return avgpooled, value

Ensuite, il a été corrigé. La cause était que lors de la déclaration d'une couche dans la spécification de modèle de tensorflow.keras, elle devait faire partie de l'init. J'ai complètement oublié. La déclaration des variables est-elle reliée partout? J'aimerais savoir même quand j'ai du temps la prochaine fois.

Recommended Posts

Erreur de la fonction décorée par tf.function lors de la tentative de création de variables lors d'un autre appel. Dans tensorflow.keras
[TensorFlow] Résoudre "ValueError: la fonction décorée par tf.function a essayé de créer des variables lors d'un autre appel"
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
Créez une fonction pour obtenir le contenu de la base de données dans Go
J'ai essayé d'informer le serveur Zabbix d'une erreur d'exécution de la fonction AWS Lambda
Pour écrire dans Error Repoting en Python sur GAE
Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack
Erreur fatale dans le lanceur: impossible de créer le processus avec '"'
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Créons une fonction pour maintenir Button dans Tkinter
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai eu une erreur lorsque j'ai essayé de traiter luigi en parallèle dans Windows, mais la solution
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo