【发布时间】:2019-03-06 01:00:10
【问题描述】:
对于应用,如pair textsimilarity,输入数据类似:pair_1, pair_2。在这些问题中,我们通常有多个输入数据。以前,我成功地实现了我的模型:
model.fit([pair_1, pair_2], labels, epochs=50)
我决定用tf.data API 替换我的输入管道。为此,我创建了一个类似于以下内容的数据集:
dataset = tf.data.Dataset.from_tensor_slices((pair_1, pair2, labels))
编译成功,但开始训练时抛出以下异常:
AttributeError: 'tuple' object has no attribute 'ndim'
我的 Keras 和 Tensorflow 版本分别是 2.1.6 和 1.11.0。我在 Tensorflow 存储库中发现了一个类似的问题:
tf.keras multi-input models don't work when using tf.data.Dataset.
有人知道如何解决这个问题吗?
这是代码的一些主要部分:
(q1_test, q2_test, label_test) = test
(q1_train, q2_train, label_train) = train
def tfdata_generator(sent1, sent2, labels, is_training):
'''Construct a data generator using tf.Dataset'''
dataset = tf.data.Dataset.from_tensor_slices((sent1, sent2, labels))
if is_training:
dataset = dataset.shuffle(1000) # depends on sample size
dataset = dataset.repeat()
dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)
return dataset
train_dataset = tfdata_generator(q1_train, q2_train, label_train, is_training=True, batch_size=_BATCH_SIZE)
test_dataset = tfdata_generator(q1_test, q2_test, label_test, is_training=False, batch_size=_BATCH_SIZE)
inps1 = keras.layers.Input(shape=(50,))
inps2 = keras.layers.Input(shape=(50,))
embed = keras.layers.Embedding(input_dim=nb_vocab, output_dim=300, weights=[embedding], trainable=False)
embed1 = embed(inps1)
embed2 = embed(inps2)
gru = keras.layers.CuDNNGRU(256)
gru1 = gru(embed1)
gru2 = gru(embed2)
concat = keras.layers.concatenate([gru1, gru2])
preds = keras.layers.Dense(1, 'sigmoid')(concat)
model = keras.models.Model(inputs=[inps1, inps2], outputs=preds)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
print(model.summary())
model.fit(
train_dataset.make_one_shot_iterator(),
steps_per_epoch=len(q1_train) // _BATCH_SIZE,
epochs=50,
validation_data=test_dataset.make_one_shot_iterator(),
validation_steps=len(q1_test) // _BATCH_SIZE,
verbose=1)
【问题讨论】:
-
也许错误与在另一个元组中嵌套元组有关?它不将内部元组识别为张量对象?你可以尝试喂它(pair1,pair2,labels)之类的东西,然后自己喂它,看看它是否有效?
-
我修改了我的示例代码,现在应该可以使用了。您可以使用以下键传递字典而不是元组:“input_1”和“input_2”。
-
@lhlmgr 我可以用 from_tensor_slices() 做同样的事情吗?
-
@AmirHadifar 是的,看我的编辑
-
试试 dataset = tf.data.Dataset.from_tensor_slices(((pair_1, pair2), labels))
标签: tensorflow keras tensorflow-datasets