web-dev-qa-db-fra.com

Chaud pour fixer le modèle Tensorflow ne fonctionne pas en mode désireux avec .fit ()?

J'essaie d'exécuter un modèle de base du CNN Keras dans l'exécution adéquate, mais Tensorflow refuse de traiter le modèle aussi impatient. J'ai initialement tenté cela dans une branche stable 1.13 (Dernière), en veillant à activer l'exécution désireuse sans résultat. J'ai mis à niveau vers 2.0 (Dernière) mais encore rien.

Modèle

class CNN2(tf.keras.Model):
  
  def __init__(self, num_classes=7):
    super(CNN2, self).__init__()
    self.cnn1 = tf.keras.layers.Conv2D(32, (5,5), padding='same', strides=(2, 2),
                                      kernel_initializer='he_normal')
    self.bn1 = tf.keras.layers.BatchNormalization()
    self.cnn2 = tf.keras.layers.Conv2D(64, (5,5), padding='same', strides=(2, 2),
                                      kernel_initializer='he_normal')
    self.cnn3 = tf.keras.layers.Conv2D(128, (5,5), padding='same', strides=(2, 2),
                                      kernel_initializer='he_normal')
    self.bn2 = tf.keras.layers.BatchNormalization()
    self.pool = tf.keras.layers.MaxPooling2D((2,2))
    self.dnn1 = tf.keras.layers.Dense(128)
    self.dropout1 = tf.keras.layers.Dropout(0.45)
    self.flatten = tf.keras.layers.Flatten()
    self.dnn2 = tf.keras.layers.Dense(512)
    self.dnn3 = tf.keras.layers.Dense(256)
    self.classifier = tf.keras.layers.Dense(num_classes)    

  def simpleLoop(self, inputs, x):
        #x_Numpy = x.numpy(),
        for i, input in inputs:
            print("{0} - {1}".format(i,len(input)))             
    
  def call(self, inputs, training=None, mask=None):
    print(tf.executing_eagerly())
    x = tf.nn.leaky_relu(self.cnn1(inputs))
    x = self.bn1(x)
    x = self.pool(x)
    x = tf.nn.leaky_relu(x)
    x = tf.nn.leaky_relu(self.bn2(self.cnn2(x)))
    x = self.pool(x)
    x = self.dropout1(tf.nn.leaky_relu(self.cnn3(x)))
    x = self.flatten(x)
    self.simpleLoop(inputs, x)
    x = self.dropout1(self.dnn1(x))
    x = self.dropout1(self.dnn2(x))
    x = self.dropout1(self.dnn3(x))
    output = self.classifier(x)
    
    #with tf.device('/cpu:0'):
    output = tf.nn.softmax(output)
      
    return output

Paramètre

batch_size = 50
epochs = 150
num_classes = 7

Vérification de l'avide est ON et VERSION

print(tf.executing_eagerly())
print(tf.__version__)
>>True
>>2.0.0-alpha0

Exécuter le modèle

modelE = CNN2(num_classes)
modelE.run_eagerly = True
print(modelE.run_eagerly)


#model = CNN2(num_classes)
modelE.compile(optimizer=tf.optimizers.Adam(0.00008), loss='categorical_crossentropy', 
              metrics=['accuracy'], run_eagerly=True)

# TF Keras tries to use entire dataset to determine shape without this step when using .fit()
# Fix = Use exactly one sample from the provided input dataset to determine input/output shape/s for the model
dummy_x = tf.zeros((1, size, size, 1))
modelE._set_inputs(dummy_x)

# Train
hist = modelE.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, 
          validation_data=(x_test, y_test), verbose=1)

# Evaluate on test set
scores = modelE.evaluate(x_test, y_test, batch_size, verbose=1)

Cela se traduit par l'erreur AttributeError: 'Tensor' object has no attribute 'numpy'

Et quand je supprimai la ligne d'incrimination x.numpy() i getez cette erreur TypeError: Tensor objects are only iterable when eager execution is enabled. To iterate over this tensor use tf.map_fn.

Il imprime également False pour la fonction print(tf.executing_eagerly()) situé dans la méthode def call() Méthode du modèle.


Comment peut-il être forcé dans le mode désireux et non un graphique? Encore une fois, j'ai essayé ceci à la fois à jour 1.13 et 2.0. Est-ce un bug?

8
ryan651

Il a fallu un certain temps pour trouver une solution qui fonctionne pour moi dans tensorflow==2.0.0, je voulais donc la partager ici au cas où il aide les autres personnes aussi:

model.compile(run_eagerly=True)

Si cela ne fonctionne pas, vous pouvez essayer de le forcer après la compilation du modèle:

model.compile()
model.run_eagerly = True
1
Brett Daley

La solution indiquée ici: https://github.com/tensorflow/tensorflow/issues/26268 devrait faire l'affaire, il existe également une explication complète ce qui cause ce comportement

0
Almog David