Я создаю пользовательскую архитектуру модели в 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)