计算YAMNET中特定图层的梯度

时间:2020-01-15 07:35:16

标签: tensorflow keras gradient

我正在尝试从YAMNET的“ layer14 / pointwise_conv”层获取渐变值。

首先,我只是打开了一个repository,以便您可以轻松地看到自己正在苦苦挣扎的完全相同的代码。

YAMNET在tf_model的结构中包含mel_spec特征提取和取景。
(例如,项目中包含的音频文件长10秒,并在处理时转换为19帧的mel_spec数据)
因此,我打算获取每个帧的grads_val,

y_c = yamnet.output[0][0, prediction.argmax()]
conv_output = yamnet.get_layer('layer14/pointwise_conv').output
grads = K.gradients(y_c, conv_output)[0]
gradient_function = K.function([yamnet.input], [conv_output, grads])

output, grads_val = gradient_function([INPUT_IMAGE])

,但是只有第一帧被正确处理。

Output

如何计算每帧的梯度?

1 个答案:

答案 0 :(得分:1)

已发布的YAMNet使用原始TensorFlow进行了培训,然后“翻译”为Keras以使其更易于使用。但是,我们不是Keras专家,我们的行为存在一些问题。

通过一次将帧呈现给分类器,您也许可以获得想要的结果。每个分类器输出帧基于0.975秒的音频(15,600个16 kHz波形样本),而后续帧则基于连续的音频块;默认情况下,帧前进0.48秒(因此15,600-7,680 =连续帧之间的7,920个重叠样本)。

如果您手动将输入分成15600个样本的重叠块,然后一次将它们传递到网络,则现有的梯度计算可能会起作用。

应该有一种更简单的解决方案,可以与所提供的Keras机械配合使用,但是我对此了解不足。