我正在用Python Tensorflow训练LSTM网络的音频数据。我的数据集是一组wave文件,read_wavfiles
变成{
from with_hyperparams import stft
from model import lstm_network
import tensorflow as tf
def read_wavfile():
for file in itertools.chain(DATA_PATH.glob("**/*.ogg"),
DATA_PATH.glob("**/*.wav")):
waveform, samplerate = librosa.load(file, sr=hparams.sample_rate)
if len(waveform.shape) > 1:
waveform = waveform[:, 1]
yield waveform
audio_dataset = Dataset.from_generator(
read_wavfile,
tf.float32,
tf.TensorShape([None]))
dataset = audio_dataset.padded_batch(5, padded_shapes=[None])
iterator = tf.data.Iterator.from_structure(dataset.output_types,
dataset.output_shapes)
dataset_init_op = iterator.make_initializer(dataset)
signals = iterator.get_next()
magnitude_spectrograms = tf.abs(stft(signals))
output, loss = lstm_network(magnitude_spectrograms)
train_op = tf.train.AdamOptimizer(1e-3).minimize(loss)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
for i in range(20):
print(i)
sess.run(dataset_init_op)
while True:
try:
l, _ = sess.run((loss, train_op))
print(l)
except tf.errors.OutOfRangeError:
break
完整的代码,包括使用的足够自由的数据(带有IPA转录的Wikipedia声音文件)是on github。在
非免费数据(EMU语料库声音文件)确实有很大的不同,但我不确定如何向您展示:
1
表示第二个循环,突然间损失又在5000左右。在DATA_PATH.glob("**/*.wav"), DATA_PATH.glob("**/*.ogg")
时,损失从5000开始下降到大约1000,然后再次跳到*.ogg
样本的4000。在重新排序这些示例会得到不同的结果,所以看起来WAV文件比OGG文件更相似。我有一个想法,洗牌最好发生在数据集的级别,而不是依赖于随机读取。然而,这意味着要将大量的wav文件读入内存,这听起来不是一个好的解决方案。在
我的代码应该是什么样子?在
这看起来像是架构中的一个问题。首先,您正在移动中生成数据,尽管这是一种常用的技术,但并不总是最合理的选择。这是因为:
最好将数据转换为numpy数组,然后将numpy数组存储在磁盘上用作数据集,如下所示:
这将使
^{pr2}$Dataset.from_generator
组件脱离问题。然后可以通过以下方式读取数据:这样可以确保数据被彻底洗牌,并产生更好的结果。在
另外,我相信您可以从一些数据预处理中受益。首先,尝试将数据集中的所有文件转换为标准波形,然后将数据保存到TFRecord。目前,您正在将它们转换成WAVE并用librosa标准化采样率,但这并不能使通道标准化。相反,请尝试使用以下函数:
最后,您可能会发现,将声音文件作为浮点读取并不符合您的最佳利益。你应该考虑尝试一下:
然后应用如下函数:
这将把WAVE文件中的数据解析为图像,然后可以像处理任何图像分类问题一样处理这些图像。在
请试试这个:
dataset.shuffle(buffer_size=1000)
添加到输入管道。在loss
的调用,以便在每个训练阶段之后进行计算。在如下图所示:
更新到输入管道
更新会话
^{pr2}$如果我可以访问一些数据示例,我可能能够更准确地帮助您。现在,我在这里瞎工作,不管怎样,一定要让我知道这是否有效。在
相关问题 更多 >
编程相关推荐