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 và ở đâ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ỗ.