我有以下数据集:
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个元素。