TypeError: Một op bên ngoài mã xây dựng hàm đang được thông qua một tenxơ đồ thị


8

Tôi đang nhận được ngoại lệ sau đây

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

mà cũng đưa ra ngoại lệ sau

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

khi chạy đoạn mã sau

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

Vấn đề rõ ràng là liên quan đến lớp tfp.layers.Convolution2DFlipout. Tại sao chính xác là tôi nhận được những ngoại lệ này? Đây có phải là do lỗi logic trong mã của tôi hay có thể là lỗi trong Xác suất TensorFlow hoặc TensorFlow? Những lỗi này có nghĩa là gì? Làm thế nào tôi có thể giải quyết chúng?

Tôi đang sử dụng TensorFlow 2.0.0 (theo mặc định thực hiện một cách háo hức). và Xác suất TensorFlow 0.8.0 và Python 3.7.4. Tôi cũng đã mở các vấn đề liên quan ở đâyở đây .

Xin vui lòng, không đề nghị tôi sử dụng TensorFlow 1, để lười biếng thực thi mã của tôi (nghĩa là sử dụng tf.compat.v1.disable_eager_execution()sau khi đã nhập TensorFlow, vì tôi biết rằng điều này sẽ làm cho mã ở trên chạy mà không nhận được ngoại lệ được đề cập) hoặc để tạo phiên rõ ràng hoặc giữ chỗ.

Câu trả lời:


0

Vấn đề này có thể được giải quyết một phần bằng cách đặt đối số experimental_run_tf_functioncủa compilephương thức thành False, như tôi đã viết trong một nhận xét cho vấn đề Github mà tôi đã mở .

Tuy nhiên, nếu bạn đặt experimental_run_tf_functionthành Falsevà bạn cố gắng sử dụng predictphương thức, bạn sẽ gặp một lỗi khác. Xem vấn đề Github này .


-1

Khi bạn đang sử dụng mô hình Tuần tự, bạn cần nhận xét Inputlớp như sau.

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

Khi bạn nhận xét Lớp đầu vào (biểu tượng tenor), mã của bạn sẽ hoạt động mà không gặp vấn đề gì. Tôi nghĩ rằng kiến ​​trúc cần phải cải thiện để có được độ chính xác tốt hơn. Đây là ý chính của mã của bạn sau khi bình luận Inputdòng đó . Cảm ơn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.