TypeError: Einem Op außerhalb des Funktionserstellungscodes wird ein Graph-Tensor übergeben

8

Ich erhalte die folgende Ausnahme

TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
For example, the following function will fail:
  @tf.function
  def has_init_scope():
    my_constant = tf.constant(1.)
    with tf.init_scope():
      added = my_constant * 2
The graph tensor has name: conv2d_flipout/divergence_kernel:0

Dies löst auch die folgende Ausnahme aus

tensorflow.python.eager.core._SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'conv2d_flipout/divergence_kernel:0' shape=() dtype=float32>]

wenn Sie den folgenden Code ausführen

from __future__ import print_function

import tensorflow as tf
import tensorflow_probability as tfp


def get_bayesian_model(input_shape=None, num_classes=10):
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Input(shape=input_shape))
    model.add(tfp.layers.Convolution2DFlipout(6, kernel_size=5, padding="SAME", activation=tf.nn.relu))
    model.add(tf.keras.layers.Flatten())
    model.add(tfp.layers.DenseFlipout(84, activation=tf.nn.relu))
    model.add(tfp.layers.DenseFlipout(num_classes))
    return model

def get_mnist_data(normalize=True):
    img_rows, img_cols = 28, 28
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

    if tf.keras.backend.image_data_format() == 'channels_first':
        x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
        x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
        input_shape = (1, img_rows, img_cols)
    else:
        x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
        x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
        input_shape = (img_rows, img_cols, 1)

    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')

    if normalize:
        x_train /= 255
        x_test /= 255

    return x_train, y_train, x_test, y_test, input_shape


def train():
    # Hyper-parameters.
    batch_size = 128
    num_classes = 10
    epochs = 1

    # Get the training data.
    x_train, y_train, x_test, y_test, input_shape = get_mnist_data()

    # Get the model.
    model = get_bayesian_model(input_shape=input_shape, num_classes=num_classes)

    # Prepare the model for training.
    model.compile(optimizer=tf.keras.optimizers.Adam(), loss="sparse_categorical_crossentropy",
                  metrics=['accuracy'])

    # Train the model.
    model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1)
    model.evaluate(x_test, y_test, verbose=0)


if __name__ == "__main__":
    train()

Das Problem hängt anscheinend mit der Schicht zusammen tfp.layers.Convolution2DFlipout. Warum genau bekomme ich diese Ausnahmen? Liegt dies an einem logischen Fehler in meinem Code oder liegt möglicherweise ein Fehler in TensorFlow oder TensorFlow Probability vor? Was bedeuten diese Fehler? Wie kann ich sie lösen?

Ich verwende TensorFlow 2.0.0 (das standardmäßig eifrig ausgeführt wird). und TensorFlow Probability 0.8.0 und Python 3.7.4. Ich habe auch das verwandte Thema hier und hier geöffnet .

Bitte schlagen Sie mir nicht vor, TensorFlow 1 zu verwenden, meinen Code träge auszuführen ( tf.compat.v1.disable_eager_execution()dh nach dem Importieren von TensorFlow zu verwenden, da ich weiß, dass der obige Code dadurch ausgeführt wird, ohne die erwähnte Ausnahme zu erhalten) oder Sitzungen explizit zu erstellen oder Platzhalter.

nbro
quelle

Antworten:

-1

Wenn Sie das sequentielle Modell verwenden, müssen Sie die InputEbene wie folgt auskommentieren.

# model.add(tf.keras.layers.Input(shape=input_shape))

Sobald Sie die Eingabeebene (symbolischer Tensor) auskommentiert haben, funktioniert Ihr Code ohne Probleme. Ich denke, die Architektur muss verbessert werden, um eine bessere Genauigkeit zu erzielen. Hier ist der Kern Ihres Codes, nachdem Sie diese InputZeile kommentiert haben . Vielen Dank!

Vishnuvardhan Janapati
quelle