我正在尝试使用神经网络的输出来转换tf.data.dataset中的数据。具体来说,我正在使用德尔塔编码器来操作tf.data管道中的嵌入。然而,在这样做的过程中,我得到了以下错误:
OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.
我搜索了数据集管道页面和堆栈溢出,但找不到解决我问题的内容。在下面的代码中,我使用了一个自动编码器,因为它会用更简洁的代码产生相同的错误。
冒犯的部分似乎是[[x,]] = tf.py_function(Auto_Func, [x], [tf.float32])
在…内CCD_ 2。
num_embeddings = 100
input_dims = 1000
embeddings = np.random.normal(size = (num_embeddings, input_dims)).astype(np.float32)
target = np.zeros(num_embeddings)
#creating Autoencoder
inp = Input(shape = (input_dims,), name ='input')
hidden = Dense(10, activation = 'relu', name = 'hidden')(inp)
out = Dense(input_dims, activation = 'relu', name='output')(hidden)
auto_encoder = tf.keras.models.Model(inputs =inp, outputs=out)
Auto_Func = tf.keras.backend.function(inputs = Autoencoder.get_layer(name='input').input,
outputs = Autoencoder.get_layer(name='output').input )
#Autoencoder transform for dataset.map
def tf_auto_transform(x, target):
x_shape = x.shape
#@tf.function
#def func(x):
# return tf.py_function(Auto_Func, [x], [tf.float32])
#[[x,]] = func(x)
[[x,]] = tf.py_function(Auto_Func, [x], [tf.float32])
x.set_shape(x_shape)
return x, target
def get_dataset(X,y, batch_size = 32):
train_ds = tf.data.Dataset.from_tensor_slices((X, y))
train_ds = train_ds.map(tf_auto_transform)
train_ds = train_ds.batch(batch_size)
return train_ds
dataset = get_dataset(embeddings, target, 2)
上述代码产生以下错误:
OperatorNotAllowedInGraphError: iterating over `tf.Tensor` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.
我试图通过运行tf_auto_transform函数的注释掉部分来消除错误,但错误仍然存在。
旁注:虽然Delta编码器论文确实有代码,但它是用tf 1.x编写的。我正尝试将tf 2.x与tf函数API一起使用。谢谢你的帮助!
冒着以n00b身份外出的风险,答案是切换映射和批处理函数的顺序。我正在尝试应用神经网络对数据进行一些更改。tf.keras模型采用批次作为输入,而不是单个样本。通过首先对数据进行批处理,我可以通过nn运行批处理。
def get_dataset(X,y, batch_size = 32):
train_ds = tf.data.Dataset.from_tensor_slices((X, y))
#The changed order
train_ds = train_ds.batch(batch_size)
train_ds = train_ds.map(tf_auto_transform)**strong text**
return train_ds
真的就这么简单。