ValueError: Cannot iterate over a shape with unknown rank

ValueError: Cannot iterate over a shape with unknown rank

我想在 mp3 歌曲上训练自动编码器。鉴于数据集的大小,如果在任何给定时间只有部分数据集在内存中会更好。

我试过的 正在使用 tfio 和 tf.data.Dataset 但这在拟合模型时给我一个错误。

ValueError: Cannot iterate over a shape with unknown rank.

代码如下

segment_length = 1024
filenames= tf.data.Dataset.list_files('data/*')

def decode_mp3(mp3_path):
   mp3_path = mp3_path.numpy().decode("utf-8")
   audio = tfio.audio.AudioIOTensor(mp3_path)
   audio_tensor = tf.cast(audio[:], tf.float32)
   overflow = len(audio_tensor) % segment_length
   audio_tensor = audio_tensor[:-overflow, 0]
   audio_tensor = tf.reshape(audio_tensor,(len(audio_tensor), 1))
   audio_tensor = audio_tensor[:, 0]
   return audio_tensor

song_dataset = filenames.map(lambda path:
   tf.py_function(func=decode_mp3, inp=[path], Tout=tf.float32))
segment_dataset = song_dataset.flat_map(lambda song: 
   tf.data.Dataset.from_tensor_slices(song)).batch(segment_length)
dataset = segment_dataset.map(lambda x: (x, x)) # add labels (identical to inputs here)

像这样的模型

encoder = keras.models.Sequential([
    keras.layers.Input((segment_length, 1)), 
    keras.layers.Conv1D(128, 3, strides=2, padding="same"),
    ...
)]

但正如我所说,调用 fit 会抛出上述错误。尽管形状和我希望的一模一样

for x,y in dataset.take(1):
    print(x.shape, y.shape)
> (1024, 1) (1024, 1)

如有任何帮助,我们将不胜感激。我可能对输入形状和数据集有误解。

所以我终于找到了部分答案。输入层似乎适用于具有功能 API (?) 的模型,我将其删除。现在模型是这样的

encoder = keras.models.Sequential([
    keras.layers.Conv1D(128, 3, strides=2, padding="same", input_shape=(segment_length, 1)),
    ...

其中输入层在第一个 Conv1D 层中被替换为 input_shape 参数。我还用

对数据集进行了批处理
ds = dataset.batch(2)

这也很重要。任何进一步的澄清仍将不胜感激。 None少了,希望能帮到有同样问题的人。