我的目标是处理一组音频文件和相应的转录本并将其提供给神经网络。 我有一个包含文件名和相应成绩单的数据框。
我想用
tensorflow.data.dataset.from_tensor_slices
创建数据管道。主要是因为与手动方法相比,它具有惰性执行。
我写了一个函数如下
def create_dataset(audio_file, label):
# Parameters for librosa.stft function
frame_length = 256
frame_step = 160
fft_length = 384
audio_file = audio_file.numpy().decode('utf-8')
# Function to load and process audio file
def load_and_process_audio(audio_file):
y, sr = librosa.load(path+audio_file, sr=16000)
stft = librosa.stft(y, n_fft=fft_length, hop_length=frame_step)
spectrogram = np.abs(stft)
spectrogram = librosa.util.fix_length(spectrogram, size=1000, axis=1)
return tf.convert_to_tensor(spectrogram.T)
# Function to convert transcription to labels
label = tf.strings.lower(label)
label = tf.strings.unicode_split(label,input_encoding = "UTF-8")
y = char_to_num(label)
y = [y.numpy()]
y= tf.keras.preprocessing.sequence.pad_sequences(y, maxlen = 200, padding = 'post', truncating = 'post' )
y = tf.convert_to_tensor(y)
# Apply load_and_process_audio function to all clips in dataframe
X = load_and_process_audio(audio_file)
# Convert transcriptions to labels
return X, y
我正在按如下方式创建数据集:请注意,因为我正在使用 librosa 创建频谱图,所以我需要将张量转换回 numpy,然后再转换回来。
batch_size = 32
train_dataset = tf.data.Dataset.from_tensor_slices((list(df_train['Clips_name']), list(df_train['transcription'])))
train_dataset = train_dataset.map(lambda audio_file, label: tf.py_function(create_dataset, [audio_file, label], [tf.float32, tf.int32]),
num_parallel_calls=tf.data.AUTOTUNE).padded_batch(batch_size, padded_shapes=([None, None], [None])).prefetch(buffer_size=tf.data.AUTOTUNE)
尝试确认 X 和 Y 的形状时出现错误。
for x, y in train_dataset:
print(x.shape, y.shape)
错误信息
(32, 1000, 193) (32, 200)
---------------------------------------------- ----------------------
3 帧 /usr/local/lib/python3.9/dist-packages/tensorflow/python/framework/ops.py in raise_from_not_ok_status(e, name) 7260 def raise_from_not_ok_status(e, name): 7261 e.message += ( " name: " + name if name is not None else "") -> 7262 raise core._status_to_exception(e) from None # pylint: disable=protected-access 7263 7264
UnknownError: {{function_node _wrapped__IteratorGetNext_output_types_2_device/job:localhost/replica:0/task:0/device:CPU:0}} InvalidArgumentError: 发现 2 个根错误。 (0) 无效参数:{{函数节点 _wrapped__Reshape_device/job:localhost/replica:0/task:0/device:GPU:0}} 重塑的输入是一个有 128 个值的张量,但请求的形状有 153 个 [[{{node Reshape}}]] [[tensor/_2]] (1) INVALID_ARGUMENT: {{function_node _wrapped__Reshape_device/job:localhost/replica:0/task:0/device:GPU:0}} 重塑的输入是一个有 128 个值的张量,但请求的形状有 153 个 [[{{node Reshape}}]] [[tensor/_1]] 0 次成功的操作。忽略 0 个派生错误。 [Op:Reshape] Traceback(最后一次调用):
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/ops/script_ops.py”,第 265 行,在call 返回函数(设备、令牌、参数)
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/ops/script_ops.py”,第 143 行,在call outputs = self._call(设备,参数)
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/ops/script_ops.py”,第 150 行,在 _call 中 ret = self._func(*args)
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/autograph/impl/api.py”,第 642 行,在包装器中 返回函数(*args,**kwargs)
文件“”,第 21 行,在 create_dataset 中 label = tf.strings.unicode_split(label,input_encoding = "UTF-8")
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/util/traceback_utils.py”,第 153 行,在 error_handler 中 从 None 提高 e.with_traceback(filtered_tb)
文件“/usr/local/lib/python3.9/dist-packages/tensorflow/python/framework/ops.py”,第 7262 行,在 raise_from_not_ok_status 从 None 中提升 core._status_to_exception(e) # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError:发现 2 个根错误。 (0) 无效参数:{{函数节点 _wrapped__Reshape_device/job:localhost/replica:0/task:0/device:GPU:0}} 重塑的输入是一个有 128 个值的张量,但请求的形状有 153 个 [[{{node Reshape}}]] [[tensor/_2]] (1) INVALID_ARGUMENT: {{function_node _wrapped__Reshape_device/job:localhost/replica:0/task:0/device:GPU:0}} 重塑的输入是一个有 128 个值的张量,但请求的形状有 153 个 [[{{node Reshape}}]] [[tensor/_1]] 0 次成功的操作。忽略 0 个派生错误。 [操作:重塑]
[[EagerPyFunc]] [Op:IteratorGetNext]
生产标签出现问题
我已经完成了填充以确保标签的长度一致,但是我收到了错误 reshape 的输入是一个有 128 个值的张量,但请求的形状有 153
我不确定为什么会这样,因为我已经完成了隐式转换,这意味着什么?