TensorFlow 训练在音频分类器的第一个时期的最后一步崩溃

Posted

技术标签:

【中文标题】TensorFlow 训练在音频分类器的第一个时期的最后一步崩溃【英文标题】:Tensorflow Training Crashes in last step of first epoch for audio classifier 【发布时间】:2021-04-01 18:43:33 【问题描述】:

我试图将最初用 Pytorch 编写的自定义 DNN 网络转换为具有所需输入形状的 Tensorflow 2 (batchsize,39,101,1)。在使用特征提取器并获得具有兼容维度的训练和验证数据集的维度后 - (total_samples,39,101,1),我尝试使用 model.fit 训练模型。在第一个 epoch 的最后一步,我遇到了如下所示的错误,这表明我的张量形状正在以某种方式发生变化。我不知道为什么这只发生在最后一步。我的回调是与模型检查点和提前停止相关的非常简单的回调,如下所示。我的数据库来自 Google Speech 数据集 v0.01。我相信这是在验证步骤开始之前发生的。如果有人能提供任何建议来解决它,那就太好了。

这是我的训练和验证数据集维度:

print(x_tr.shape) -> (17049, 39, 101, 1)
print(y_tr.shape) -> (17049, 10)
print(x_val.shape) -> (4263, 39, 101, 1)
print(y_val.shape) -> (4263, 10)
modelname, input_shape, numclass = 'CRNN', (39,101,1), 10

model = modelcreator.getmodel(modelname, input_shape, numclass)
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10, min_delta=0.0001) 
mc = ModelCheckpoint('best_model.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')
history=model.fit(x_tr, y_tr ,epochs=100, callbacks=[es,mc], batch_size=64, validation_data=(x_val,y_val))

纪元 1/100 266/267 [============================>.] - ETA:0s - 损失: 0.9436 - 准确度:0.6963

----------------------------------- ---------------------------- InvalidArgumentError Traceback(最近调用 最后)在 ----> 1 history=model.fit(x_tr, y_tr ,epochs=100, callbacks=[es,mc], batch_size=64, validation_data=(x_val,y_val))

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py 在 _method_wrapper(self, *args, **kwargs) 106 def_method_wrapper(自我,*args,**kwargs): 107 如果不是 self._in_multi_worker_mode(): # pylint: disable=protected-access --> 108 返回方法(self, *args, **kwargs) 109 110 # 已经在run_distribute_coordinator 内部运行了。

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split,validation_data,shuffle,class_weight, sample_weight,initial_epoch,steps_per_epoch,validation_steps, validation_batch_size,validation_freq,max_queue_size,工人, 使用多处理)1096 批次大小=批次大小): 第1097章 -> 1098 tmp_logs = train_function(iterator) 1099 if data_handler.should_sync: 1100 context.async_wait()

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py 在调用(自我,*args,**kwds) 778 其他: 779编译器=“非Xla” --> 780 结果 = self._call(*args, **kwds) 781 第782章

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py 在 _call(self, *args, **kwds) 805 # 在这种情况下,我们在第一次调用时创建了变量,所以我们运行 806 # deunned 版本,保证永远不会创建变量。 --> 807 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable 808 elif self._stateful_fn 不是无: 809 # 提前释放锁,以便多线程执行调用

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/function.py 在 调用(self, *args, **kwargs) 2827 with self._lock: 第2828章 self._maybe_define_function(args, kwargs) -> 2829 return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access 2830 2831 @property

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/function.py 在 _filtered_call(self, args, kwargs, cancel_manager) 1846 resource_variable_ops.BaseResourceVariable))], 1847 capture_inputs=self.captured_inputs, -> 1848 cancel_manager=cancellation_manager) 1849 1850 def _call_flat(self, args, capture_inputs, cancel_manager=None):

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/function.py 在 _call_flat(self, args, capture_inputs, cancel_manager) 1922 # 没有磁带在看;跳到运行函数。 1923年回归 self._build_call_outputs(self._inference_function.call( -> 1924 ctx、args、cancellation_manager=cancellation_manager)) 1925 forward_backward = self._select_forward_and_backward_functions( 1926 参数,

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/function.py 通话中(self,ctx,args,cancellation_manager) 548 个输入 = 参数, 第549章 --> 550 ctx=ctx) 551 其他: 552 个输出 = 执行.execute_with_cancellation(

~/Desktop/Spoken_Keyword_Spotting/newenv/lib/python3.6/site-packages/tensorflow/python/eager/execute.py 在 quick_execute(op_name, num_outputs, 输入, attrs, ctx, name) 58 ctx.ensure_initialized() 59 张量 = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, ---> 60 个输入、属性、num_outputs) 61 除了 core._NotOkStatusException 作为 e: 62 如果名称不是无:

InvalidArgumentError: 指定了一个形状为 [64,512] 的列表,来自 形状为 [25,512] [[node TensorArrayUnstack/TensorListFromTensor]] [[functional_3/lstm_1/PartitionedCall]] [操作:__inference_train_function_13255]

函数调用栈:train_function -> train_function -> train_function

【问题讨论】:

如果你在epoch的最后一批得到错误,如果你将batch-size设置为“1”会发生什么,你会得到同样的错误吗? 您好,感谢您的回复,我找到了答案。是的,使用 bs 1 它有效 【参考方案1】:

我是从下面的链接中找到的。根据这里的答案: InvalidArgumentError: Specified a list with shape [60,9] from a tensor with shape [56,9]

我的模型最后包含一个 LSTM 层,返回序列=True。因此,在最后一个时期,收到的批次的样本少于批次大小。遇到了这个问题

【讨论】:

以上是关于TensorFlow 训练在音频分类器的第一个时期的最后一步崩溃的主要内容,如果未能解决你的问题,请参考以下文章

训练准确性增加,然后偶尔突然下降。使固定? [Keras] [TensorFlow 后端]

Keras 在训练分类 LSTM 序列到序列模型时给出 nan

恢复使用迭代器的 TensorFlow 模型

为啥 Spark ML 感知器分类器的 F1 分数很高,而 TensorFlow 上的相同模型表现很差?

应用深度学习使用 Tensorflow 对音频进行分类

TensorFlow 对象检测 api:使用预训练模型在训练中更改类数时的分类权重初始化