You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Coursera唤醒词检测Notebook适配自定义词及解决训练问题

问题

我已经完成Coursera上Andrew Ng深度学习专项课程(序列模型)中的唤醒词检测Notebook,原Notebook使用预训练的"activate"唤醒词模型。我尝试用Google Colab结合自有数据训练"Alexa"唤醒词模型:

  • 正样本:Kaggle获取的369条16000Hz的"Alexa"语音样本
  • 负样本:谷歌语音命令数据集+YouTube收集的环境音

严格遵循原Notebook步骤仅替换训练数据后,遇到以下问题:

  1. 生成4000个训练样本时RAM迅速耗尽,无法完成数据集创建
  2. 减少样本数量或降低采样率至1600Hz/8000Hz后,模型效果极差
  3. 调整batch_size、learning_rate后无明显改善

以下是我的关键代码:

生成训练样本代码

nsamples = 4000
X_train = []
Y_train= []
X_test = []
Y_test = []
train_count = 0
test_count = 0

to_test = False
for i in range(0, nsamples):

    if i % 500 == 0:
      print(i)
    rand = random.randint(0,61)

    if i%5 == 0:
      x, y = create_data_example(backgrounds_list[rand], alexa_list, negatives_list, Ty, name=str(i),to_test = True)
      X_test.append(x.swapaxes(0,1))
      Y_test.append(y.swapaxes(0,1))
      test_count+=1
    else:
      x, y = create_data_example(backgrounds_list[rand], alexa_list, negatives_list, Ty, name=str(i),to_test = False)
      X_train.append(x.swapaxes(0,1))
      Y_train.append(y.swapaxes(0,1))
      train_count+=1

print("Number of training samples:", train_count)
print("Number of testing samples:", test_count)

X_train = np.array(X_train)
Y_train = np.array(Y_train)

np.save('XY_train/X_train.npy', X_train)
np.save('XY_train/Y_train.npy', Y_train)

X_test = np.array(X_test)
Y_test = np.array(Y_test)
np.save('XY_test/X_test.npy', X_test)
np.save('XY_test/Y_test.npy', Y_test)

print('done saving')
print('X_train.shape: ',X_train.shape)
print('Y_train.shape: ',Y_train.shape)

模型定义代码

def model(input_shape):
    X_input = Input(shape = input_shape)
    
    X = Conv1D(196,15,strides=4)(X_input)                                 
    X = BatchNormalization()(X)                              
    X = Activation('relu')(X)                                
    X = Dropout(0.8)(X)                               
    
    X = GRU(128,return_sequences = True)(X)
    X = Dropout(0.8)(X)        
    X = BatchNormalization()(X)
    
    X = GRU(128,return_sequences=True)(X)               
    X = Dropout(0.8)(X)                                 
    X = BatchNormalization()(X)                         
    X = Dropout(0.8)(X)                                 
    
    X = TimeDistributed(Dense(1, activation = "sigmoid"))(X) # time distributed  (sigmoid)

    model = Model(inputs = X_input, outputs = X)
    
    return model

训练代码

opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=["accuracy"])
model.fit(X_train, Y_train, batch_size = 5, epochs=20,validation_data=(X_test,Y_test))

请问操作是否有误?有哪些改进建议?


分析与改进建议

一、解决RAM耗尽问题

  1. 避免内存堆积样本:当前代码把所有样本先存在列表再转numpy数组,4000条16000Hz语音会占用极大内存。改成生成一个样本就直接写入磁盘,或者用TensorFlow Dataset实时生成样本喂给模型,完全不用提前加载所有数据到内存。
  2. 优化音频加载逻辑:检查backgrounds_list是否提前加载了所有背景音到内存,改成按需单条加载生成样本,用完即释放;同时排查create_data_example函数是否有未释放的中间变量导致内存泄漏。

二、提升模型效果

  1. 保留16000Hz采样率:降采样会丢失唤醒词关键高频特征,必须保留原采样率,通过优化数据集生成逻辑解决内存问题,而非降低采样率。
  2. 扩充正样本数量:369条正样本太少,做以下数据增强:
    • 轻微调整语速、音调
    • 叠加低音量背景噪声
    • 随机裁剪唤醒词的起止位置(保证核心发音完整)
    • 时间拉伸、音频反转(增加样本多样性)
  3. 调整模型参数:
    • 降低Dropout比例:连续三层0.8的Dropout会导致模型难以学习有效特征,建议改为0.3-0.5
    • 取消固定学习率衰减:decay=0.01会让学习率下降过快,改用ReduceLROnPlateau回调,在验证集loss停滞时再降学习率
    • 适配Conv1D参数:确保Conv1D输出序列长度与GRU层匹配,若输入音频长度固定,可调整kernel或strides数值
  4. 优化训练策略:
    • 处理类别不平衡:在model.compile中设置class_weight给正样本更高权重,或生成样本时控制正负样本比例(如1:3)
    • 增加训练轮数:20轮可能未收敛,增加到50-100轮,配合EarlyStopping回调防止过拟合
    • 增大batch_size:batch_size=5太小导致训练不稳定,内存允许时调到16或32,或用梯度累积模拟大batch

三、细节优化

  • 检查标签准确性:确认create_data_example生成的Y标签中,唤醒词的时间窗口标注无误
  • 统一音频预处理:所有音频归一化到[-1,1],固定输入长度(如10秒,不足补零、过长截断)
  • 分析错误类型:用混淆矩阵查看漏检/误检情况,漏检多就加正样本增强,误检多就增加难负样本(易误判的环境音)

内容的提问来源于stack exchange,提问作者user23662181

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:17:13