将2D张量馈入RRN/LSTM层



我有以下数据集:

for x, y in ds_train.take(1):
print(i, j)

输出:

tf.Tensor(
[[-0.5         0.8660254  -0.67931056 -0.7338509   0.          0.
0.          0.          0.          0.          1.          0.
0.          0.          0.          0.          0.          0.
0.          0.          0.          0.          0.          0.        ]
...
[-0.5         0.8660254  -0.9754862  -0.22006041  0.          0.
0.          0.          0.          0.          0.          0.
0.          0.          0.          0.          0.          0.
0.          0.          0.          0.          0.          0.        ]],
shape=(36, 24), dtype=float32) tf.Tensor([0 0 0 0 0 0 1 0], shape=(8,), dtype=int64)

我想把这个数据输入到RNN层:

model = tf.keras.models.Sequential([
tf.keras.layers.SimpleRNN(40, input_shape=(36,24)),
tf.keras.layers.Dense(8),
])
model.compile(loss='mae', optimizer='adam')
history = model.fit(ds_train, epochs=100)

我得到以下错误:

ValueError: Input 0 of layer "sequential_12" is incompatible with the layer:
expected shape=(None, 36, 24), found shape=(None, 24)

我不明白为什么found shape等于(None, 24)。我们可以看到,数据集中张量的形状等于(36, 24)。将这些数据(其中0轴是时间,例如36个时间戳和24个特征)馈送到RNN/LSTM层的正确方法是什么?

更新:正如@AloneTogether指出的,我需要先批处理我的数据。在这种情况下,我得到了另一个错误:

File "/home/mykolazotko/miniconda3/envs/tf/lib/python3.9/site-packages/keras/losses.py", line 1455, in mean_absolute_error
return backend.mean(tf.abs(y_pred - y_true), axis=-1)
Node: 'mean_absolute_error/sub'
required broadcastable shapes
[[{{node mean_absolute_error/sub}}]] [Op:__inference_train_function_32704]

看起来损失函数不像我的形状为(8,)的目标张量。

也许试着改变你的input_shape,它目前只考虑特征维度:

tf.keras.layers.SimpleRNN(40, input_shape=(36, 24))

不要忘记在数据集上设置批处理大小:

ds_train = ds_train.batch(your_batch_size)

否则,36会被误解为你的批量尺寸。

下面是一个工作示例:

import tensorflow as tf
x = tf.random.normal((50, 36, 24))
y = tf.random.uniform((50, 8), dtype=tf.int32, maxval=2)
model = tf.keras.models.Sequential([
tf.keras.layers.SimpleRNN(40, input_shape=(36,24)),
tf.keras.layers.Dense(8),
])
ds_train = tf.data.Dataset.from_tensor_slices((x, y)).batch(2)
model.compile(loss='mae', optimizer='adam')
history = model.fit(ds_train, epochs=100)

确保你的标签确实总是为每个样品提供8个元素。

相关内容

  • 没有找到相关文章

最新更新