TensorFlow 2.0 Eager Mode вызывает ошибку при вызове fit () на генераторе, а режим Graph - нет - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю пользовательскую архитектуру модели в TensorFlow, которая использует некоторые токенизированные текстовые последовательности. Мои данные достаточно велики, и я передаю их методу fit () с помощью генератора данных. Сеть состоит из множества подсетей, каждая из которых содержит несколько уровней Embedding и LSTM, и эти подсети затем объединяются в один выходной слой.

Моя проблема заключается в том, что, когда я пытаюсь подогнать модель в режиме Eager, я получаю ошибка

TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'

Но когда я отключаю нетерпеливый режим, модель тренируется нормально. Я мог бы с этим смириться, за исключением того, что согласно этому посту , cuDNN не может использоваться на слоях LSTM, когда режим Eager отключен в TF 2.0, что является проблемой для меня. Я не знаю, есть ли у меня фундаментальное недопонимание режима «нетерпеливый против графика», или я что-то упускаю из виду. Любые идеи будут оценены.

Вот упрощенный пример, воспроизводящий проблему:

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input, Flatten, Embedding, Add, LSTM

# Generator for dummy data
vocab1 = 100
vocab2 = 150

def generator(batch_size):
    while True:
        feature1 = np.random.randint(low=0, high=vocab1, size = (batch_size, 25))
        feature2 = np.random.randint(low=0, high=vocab2, size = (batch_size, 25))
        x = [feature1, feature2]
        y = np.random.randint(low=0, high=1, size = (batch_size, 1))
        yield (x, y)

# Model architecture
def Subnet(input_layer, input_dim):
    embedding_1 = Embedding(
        input_dim=input_dim, output_dim=10, input_length=25
    )(input_layer)
    lstm_1 = LSTM(
        units=10,
        return_sequences=True,
        dropout=0.2,
        recurrent_dropout=0.2
    )(embedding_1)
    return Flatten()(lstm_1)

def FooNet():
    input_layers = []
    subnets = []
    for vocab_length in [vocab1, vocab2]:
        input_layer = Input(shape=(25,))
        input_layers.append(input_layer)
        sn = Subnet(
            input_layer=input_layer,
            input_dim=vocab_length
        )
        subnets.append(sn)
    added_1 = Add()(subnets)
    output_layer = Dense(units=1, activation="sigmoid")(added_1)
    return Model(inputs = input_layers, outputs=output_layer)

gen = generator(batch_size=10)

# uncommenting this causes error
# tf.compat.v1.disable_eager_execution()

model = FooNet()
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["acc"])
model.fit(x=gen, steps_per_epoch=10, epochs=5, verbose=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...