【发布时间】:2019-01-26 00:35:26
【问题描述】:
我正在 Python Tensorflow 中针对音频数据训练 LSTM 网络。我的数据集是一堆波形文件,read_wavfiles 变成了numpy 数组的生成器。我决定尝试用相同的数据集训练我的网络 20 次,并编写了如下代码。
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 转录的维基百科声音文件),是 on github。
非免费数据(EMU 语料库声音文件)确实有很大的不同,但我不确定如何向您展示:
- 在整个数据集上运行脚本时,输出从迭代 0 开始,损失约为 5000,然后在整个数据集上减少到约 1000。然后出现
1表示第二个循环的行,突然损失又在 5000 左右。 - 将订单交换到
DATA_PATH.glob("**/*.wav"), DATA_PATH.glob("**/*.ogg")时,损失从 5000 以下开始下降到 1000 左右,然后对于*.ogg样本再次跃升至 4000。
重新排序样本会给我一个不同的结果,所以看起来 WAV 文件比 OGG 文件更相似。我有一个概念,洗牌应该理想地发生在数据集的级别,而不是依赖于以随机顺序读取它。但是,这意味着将大量 wav 文件读入内存,这听起来不是一个好的解决方案。
我的代码应该是什么样的?
【问题讨论】:
-
我不太了解
tensorflow的编程约定。随意编辑我的代码 sn-p 以使其符合任何此类约定,因此更易于其他用户阅读。 -
对于初学者来说,全局变量初始化通常在
tf.Session的范围内完成。在with tf.Session() as sess:循环内移动init_op = tf.global_variables_initializer()有帮助吗?没有任何数据很难调试。 -
对于调试,有TensorBoard 和TensorFlow Debugger。我自己刚开始学习 TensorBoard,但它似乎很有帮助。
-
这听起来像是您的数据集有问题。您可以添加代码/您的
read_wavfile函数的粗略描述吗?如果可以的话,使用Dataset的 shuffle/batch/repeat 方法比自己做这些常见的事情更不容易出错。检查this answer 了解详情,或者如果您发布您的生成器功能,我可能会更有用:)。 -
我已经添加了 read_wavfile 代码,我只是在尝试其他建议,无论是在减少的数据集上还是在原始数据上。
标签: python tensorflow tensorflow-datasets