Tensorflow版本:2.1.0
使用tf.keras构建的模型
图形卡:Nvidia GTX 1660TI 6GB DDR6
CPU:英特尔i7第9代
Ram:16 GB DDR4
存储磁盘:SSD(NVME)
我编写了一个代码,使用tf.keras以多线程的方式批量读取音频文件。有多个工作程序的序列,但是该代码的问题是CPU在训练GPU时并没有同时读取下一组音频批次因此,GPU最多只能使用其最大容量的30%(一个纪元的训练时间约为25分钟)。
因此,我决定移至tf.data.Datasets.from_generator以使用现有的生成器功能以更有效的方式读取批处理。但是该输入管道的性能更差(训练一个纪元需要47分钟)。我已经附加了我用来阅读的代码,以创建输入管道。我已经从excel文件中读取了文件名及其类别,并将其提供给生成器并创建了管道。
即使在应用预取之后,管道的性能仍然非常糟糕。
由于这是我第一次使用tf.data API,因此请问是否有任何错误。
这是我生成批处理的代码。
# Function read the audio files
def get_x(file):
data = []
for i in file:
audio, fs = sf.read(i, dtype="float32")
data.append(audio[::2])
data = np.array(data, dtype=np.float32)
data = np.expand_dims(data, axis=-1)
return data
def data_generator(files, labels, batchsize):
while True:
start = 0
end = batchsize
while start < len(files):
x = get_x(files[start:end])
y = np.array(tf.keras.utils.to_categorical(labels[start:end], num_classes=2), dtype=np.float32)
yield x, y
start += batchsize
end += batchsize
# Get the tensorflow data dataset object to generate batches
def tf_data_dataset(files, labels, batch_size):
autotune = tf.data.experimental.AUTOTUNE
dataset = tf.data.Dataset.from_generator(
data_generator,
output_types=(np.float32, np.float32),
output_shapes=(tf.TensorShape([None, 16000, 1]),
tf.TensorShape([None, 2])),
args=(files, labels, batch_size))
dataset = dataset.prefetch(buffer_size=autotune)
return dataset