【问题标题】:Creating your own dataset in tensorflow在 tensorflow 中创建自己的数据集
【发布时间】:2022-01-25 06:05:43
【问题描述】:

我面临着通过频谱图对声音进行分类的任务。我以一种方式解决了这个问题(我会将所有录音转换为频谱图 -> 将它们保存为图片并为此训练神经网络),但我想采用更简单的方法,即不保存图片,但是立即将音频文件转换为张量,但是有一个问题,我找不到任何有关如何在 TensorFlow 中从张量创建我的数据集的有用信息。我将在 Pytorch 上给出这样的代码示例。

class SoundDataset(Dataset):
  def __init__(self, file_names, labels):
    self.file_names = file_names
    self.labels = labels
  def __getitem__(self,index):
    #format the file path and load the file
    path = self.file_names[index]
    scale, sr = librosa.load(path)
    filter_banks = librosa.filters.mel(n_fft=2048, sr=22050, n_mels=10)
    mel_spectrogram = librosa.feature.melspectrogram(scale, sr=sr, n_fft=2048, hop_length=512, n_mels=32)
    log_mel_spectrogram = librosa.power_to_db(mel_spectrogram)
    trch = torch.from_numpy(log_mel_spectrogram)
    if log_mel_spectrogram.shape !=(10,87):
      delta = 87 - log_mel_spectrogram.shape[1]
      trch = torch.nn.functional.pad(trch, (0,delta))

    return trch,self.labels[index]
  def __len__(self):
    return len(self.file_names)

这里正在创建一个类,它获取音频记录的路径并将它们转换为张量,如果张量不适合形状,则会填充零。如何为 TensorFlow 创建相同的类。接下来是一个代码示例,它使用文件路径及其类创建元组,并创建声音数据集类的对象,并相应地从这些文件生成数据集。所有这些都是为 Pytorch 编写的。告诉我如何为 TensorFlow 实现它。

path = '/content/drive/MyDrive/МДМА/audiodata/for-rerecorded/training/'
files = []
labels = []
lbl = '1 0'.split()
for lab in lbl:
  if lab == '0': 
    c = 'fake' 
  else: 
    c ='real'
  names = os.listdir(path+c)
  for n in names:
    pth = path+c+'/'+n
    files.append(pth)
    labels.append(int(lab))
train_dataset = SoundDataset(files, labels)
train_loader = torch.utils.data.DataLoader(train_dataset,batch_size = 20)

【问题讨论】:

  • 你的数据集在哪里?
  • 这是一个包含 3 个文件夹(训练、验证、测试)和音频文件的目录

标签: python tensorflow pytorch conv-neural-network


【解决方案1】:

如果您阅读了documentation,则有代码模式。

这未经测试,但如果您从已将文件映射到索引的另一个数据结构加载索引,则此代码可以提供帮助。

import librosa
import pathlib
import tensorflow as tf

DATASET_PATH = 'data/mini_speech_commands'

data_dir = pathlib.Path(DATASET_PATH)
if not data_dir.exists():
  tf.keras.utils.get_file(
      'mini_speech_commands.zip',
      origin="http://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip",
      extract=True,
      cache_dir='.', cache_subdir='data')


def load_audio(filename):
    scale, sr = librosa.load(filename)
    mel_spectrogram = librosa.feature.melspectrogram(scale, sr=sr, n_fft=2048, hop_length=512, n_mels=32)
    log_mel_spectrogram = librosa.power_to_db(mel_spectrogram)
    spectrogram_numpy = log_mel_spectrogram.numpy()
    if log_mel_spectrogram.shape !=(10,87):
      delta = 87 - log_mel_spectrogram.shape[1]
      spectrogram_numpy = tf.pad(spectrogram_numpy, (0,delta))
    return spectrogram_numpy #return index

read_audio = lambda x: tf.py_function(load_audio,
                                           [x],
                                           tf.float64)
filenames = tf.io.gfile.glob(str(data_dir) + '/*/*')
files_ds = tf.data.Dataset.from_tensor_slices(filenames)

waveform_ds = files_ds.map(
    map_func=read_audio)

pad的代码是直接用TensorFlow转换的,你要测试一下。

更新:keras.utils.Sequence 的另一种使用方式显示在此thread

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多