我正在使用 TF 2.5,我正准时地学习 https://www.tensorflow.org/text/tutorials/text_generation 上的教程,只是为了获得一些信心。
但我不明白为什么在构建模型后我会在维度上出现不一致;它需要一个 3 维层,但它只接收两个。
ValueError: Input 0 of layer gru is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (64, 100)
同时教程中也没有发现这个问题,即使使用他们自己的数据集,这让我感到困惑。
然后我尝试了各种组合,甚至在数据集中生成了一个虚拟维度,但我没有得到想要的结果。
我以某种方式理解问题应该出在数据集构造上,因为:
<PrefetchDataset shapes: ((64, 100), (64, 100)), types: (tf.int64, tf.int64)>
我发现我缺少一个维度。但是我如何向它“添加”一个维度,或者反之亦然排除模型以期望 3 维(但是,在这种情况下,我想知道整个模型的含义是什么),目前尚不清楚。
我读过很多类似的案例(包括 GRU 和 LSTM)并尝试了各种选择,但鉴于我的不熟悉,我觉得我处于停滞状态。
如果有人能给我小费,我将不胜感激。
这是我的代码(复制上面链接的 TensorFlow 页面上的代码):
(这也是我在 SO 上的第一篇文章!)
BATCH_SIZE = 64
BUFFER_SIZE = 10000
dataset = (dataset
.shuffle(BUFFER_SIZE)
.batch(BATCH_SIZE, drop_remainder=True)
.prefetch(tf.data.experimental.AUTOTUNE))
vocab_size = len(vocab)
embedding_dim = 256
rnn_units = 1024
class MyModel(tf.keras.Model):
def __init__(self, vocab_size, embedding_dim, rnn_units):
super().__init__(self)
self.embedding = tf.keras.layers.GRU(rnn_units, return_sequences=True, return_state=True)
self.dense = tf.keras.layers.Dense(vocab_size)
def call(self, inputs, states=None, return_state=False, training=False):
x = inputs
x = self.embedding(x, training=training)
if states is None:
states = self.gru.get_initial_state(x)
x = self.dense(x, training=training)
if return_state:
return x, states
else:
return x
model = MyModel(vocab_size=len(ids_from_chars.get_vocabulary()), embedding_dim=embedding_dim, rnn_units=rnn_units)
for input_example_batch, target_example_batch in dataset.take(1):
example_batch_predictions = model(input_example_batch)
print (example_batch_predictions.shape, "# (batch_size, sequence_length, vocab_size)")