tf.keras.backend. функция для преобразования вложений внутри tf.data.dataset

Я пытаюсь использовать вывод нейронной сети для преобразования данных внутри tf.data.dataset. В частности, я использую Delta-Encoder для управления вложениями внутри конвейера 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])внутриtf_auto_transform.

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, но ошибка не исчезла.

SideNote: Хотя это правда, что в документе о кодировщике Delta есть код, он написан в tf 1.x. Вместо этого я пытаюсь использовать tf 2.x с функциональным API tf. Спасибо за помощь!

1 ответ

Решение

Рискуя выступить в роли новичка, ответ - переключить порядок карт и пакетных функций. Я пытаюсь применить нейронную сеть, чтобы внести некоторые изменения в данные. Модели 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

Это действительно настолько просто.

Другие вопросы по тегам