TypeError:関数構築コード外の操作にグラフテンソルが渡されています


8

次の例外が発生します

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

また、次の例外が発生します

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>]

次のコードを実行すると

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()

問題は明らかにレイヤーに関連していtfp.layers.Convolution2DFlipoutます。なぜこれらの例外が発生するのですか?これは私のコードの論理エラーが原因ですか、それともTensorFlowまたはTensorFlow Probabilityのバグですか?これらのエラーはどういう意味ですか?どうすれば解決できますか?

TensorFlow 2.0.0(デフォルトで熱心に実行されます)を使用しています。TensorFlow Probability 0.8.0およびPython 3.7.4。また、ここここで関連する問題を開きました

TensorFlow 1を使用してコードを遅延実行する(つまり、tf.compat.v1.disable_eager_execution()TensorFlowをインポートした後に使用すると、上記のコードが上記の例外なしで実行されることがわかっているため)、または明示的にセッションを作成することを提案しないでください。またはプレースホルダー。

回答:


0

この問題experimental_run_tf_functionは、compileメソッドの引数をに設定することで部分的に解決できます。これは、私が開いたGithubの問題にコメントでFalse書いたためです。

ただし、に設定experimental_run_tf_functionFalsepredictメソッドを使用しようとすると、別のエラーが発生します。このGithubの問題を参照してください。


-1

シーケンシャルモデルを使用しているためInput、次のようにレイヤーをコメントアウトする必要があります。

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

入力(シンボリックテンソル)レイヤーをコメント化すると、コードは問題なく機能します。精度を上げるには、アーキテクチャを改善する必要があると思います。これは、そのInput行にコメントを付けた後のコードの要点です。ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.