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少了,希望能帮到有同样问题的人。
我想在 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少了,希望能帮到有同样问题的人。