警告:标签文件 {label_path} 缺失,对应音频文件为 {audio_path} 警告:标签文件 {label_path} 缺失,对应音频文件为 {audio_path} 成功加载 {len(audio_paths)} 条数据 真实数据加载失败: {e},生成模拟数据... 2025-05-29 22:06:57.795320: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. WARNING:tensorflow:From E:\学习资料\语音识别课设\data_thchs30\train\2.py:18: The name tf.nn.ctc_loss is deprecated. Please use tf.compat.v1.nn.ctc_loss instead. Traceback (most recent call last): File "C:\Users\20323\miniconda3\Lib\site-packages\IPython\core\interactiveshell.py", line 3667, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-e574e183a3d8>", line 1, in <module> runfile('E:\\学习资料\\语音识别课设\\data_thchs30\\train\\2.py', wdir='E:\\学习资料\\语音识别课设\\data_thchs30\\train') File "D:\pycharm\PyCharm 2024.1.1\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\pycharm\PyCharm 2024.1.1\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "E:\学习资料\语音识别课设\data_thchs30\train\2.py", line 344, in <module> temp_recognizer = SpeechRecognizer(num_classes=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\学习资料\语音识别课设\data_thchs30\train\2.py", line 55, in __init__ self.build_model() File "E:\学习资料\语音识别课设\data_thchs30\train\2.py", line 102, in build_model ctc_output = ctc_layer(labels, output, input_length, label_length) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\20323\miniconda3\Lib\site-packages\keras\src\utils\traceback_utils.py", line 122, in error_handler raise e.with_traceback(filtered_tb) from None File "C:\Users\20323\miniconda3\Lib\site-packages\keras\src\layers\layer.py", line 814, in symbolic_call return self.compute_output_spec(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: Exception encountered when calling CTCLayer.call(). CTCLayer.compute_output_spec() takes 2 positional arguments but 5 were given Arguments received by CTCLayer.call(): • args=('<KerasTensor shape=(None, None), dtype=int32, sparse=False, ragged=False, name=labels>', '<KerasTensor shape=(None, 250, 1), dtype=float32, sparse=False, ragged=False, name=keras_tensor_11>', '<KerasTensor shape=(None, 1), dtype=int32, sparse=False, ragged=False, name=input_length>', '<KerasTensor shape=(None, 1), dtype=int32, sparse=False, ragged=False, name=label_length>') • kwargs=<class 'inspect._empty'> 运行时出现以上问题,如何解决
时间: 2025-06-01 20:15:01 浏览: 18
### 修复CTCLayer调用时参数数量不匹配的问题
在代码中,`CTCLayer.compute_output_spec` 方法的实现存在一个潜在问题:方法签名与实际调用时的参数数量不匹配。具体来说,`compute_output_spec` 方法期望接收所有输入张量作为元组或列表,但实际调用时可能未正确传递这些参数[^1]。
以下是修正后的 `compute_output_spec` 方法:
```python
def compute_output_spec(self, *inputs):
"""
inputs 是一个包含所有输入张量的元组,顺序为:y_true, y_pred, input_length, label_length
"""
if len(inputs) != 4:
raise ValueError("CTCLayer期望输入是包含4个张量的元组或列表,实际接收{len(inputs)}个参数")
y_true, y_pred, input_length, label_length = inputs
return tf.TensorSpec(shape=y_pred.shape, dtype=y_pred.dtype)
```
上述修正确保了方法能够正确接收并处理四个输入参数,并在参数数量不匹配时抛出异常以提示开发者。
---
### 处理标签文件缺失问题
在加载数据集时,如果某些音频文件缺少对应的标签文件,程序会跳过这些样本并记录警告信息。然而,这种处理方式可能导致最终训练集规模缩小,影响模型性能。为了更优雅地处理标签文件缺失问题,可以引入默认值填充机制。
以下是改进后的标签加载逻辑:
```python
for filename in os.listdir(split_dir):
if filename.lower().endswith(".wav"):
audio_path = os.path.join(split_dir, filename)
label_filename = f"{os.path.splitext(filename)[0]}.wav.trn"
label_path = os.path.join(split_dir, label_filename)
if not os.path.exists(label_path):
print(f"警告:标签文件 {label_path} 缺失,使用默认空标签替代")
labels.append("") # 使用空字符串作为默认标签
audio_paths.append(audio_path)
continue
try:
with open(label_path, "r", encoding='utf-8') as f:
label = f.readline().strip()
if 0 < len(label) <= 200:
audio_paths.append(audio_path)
labels.append(label)
except Exception as e:
print(f"加载 {label_path} 失败: {e}")
```
通过引入默认空标签,程序可以避免因标签文件缺失而导致的数据丢失问题,同时保留警告信息以便后续检查和修正[^2]。
---
### 解决TensorFlow的ctc_loss弃用警告
当前代码中使用的 `tf.compat.v1.nn.ctc_loss` 函数已被标记为弃用,建议改用更新的 `tf.nn.ctc_loss` 函数[^3]。以下是修正后的 CTC 损失计算部分:
```python
self.loss_fn = tf.nn.ctc_loss
loss = self.loss_fn(
labels=y_true,
logits=y_pred,
label_length=label_length,
logit_length=input_length,
logits_time_major=False,
blank_index=0 # 空白符索引
)
```
此外,还需要确保 TensorFlow 版本兼容性。如果使用的是 TensorFlow 2.x 版本,需启用 Eager Execution 或在自定义层中显式禁用它以支持图模式执行[^3]。
---
### 完整修正后的 CTCLayer 实现
以下是修正后的完整 `CTCLayer` 类实现:
```python
class CTCLayer(layers.Layer):
def __init__(self, name=None):
super().__init__(name=name)
self.loss_fn = tf.nn.ctc_loss
def call(self, inputs, **kwargs):
if len(inputs) != 4:
raise ValueError("CTCLayer期望输入是包含4个张量的元组或列表")
y_true, y_pred, input_length, label_length = inputs
label_length = tf.squeeze(label_length, axis=-1)
input_length = tf.squeeze(input_length, axis=-1)
loss = self.loss_fn(
labels=y_true,
logits=y_pred,
label_length=label_length,
logit_length=input_length,
logits_time_major=False,
blank_index=0
)
self.add_loss(tf.reduce_mean(loss))
return y_pred
def compute_output_spec(self, *inputs):
if len(inputs) != 4:
raise ValueError("CTCLayer期望输入是包含4个张量的元组或列表,实际接收{len(inputs)}个参数")
y_true, y_pred, input_length, label_length = inputs
return tf.TensorSpec(shape=y_pred.shape, dtype=y_pred.dtype)
```
---
###
阅读全文
相关推荐



















