使用Keras/TensorFlow进行fp16/RTX卡半精度训练



我刚买了一台RTX 2070 Super,我想尝试使用带有TensorFlow后端的Keras进行半精度训练。

到目前为止,我已经找到了像这样的文章,建议使用这种设置:

import keras.backend as K
dtype='float16'
K.set_floatx(dtype)
# default is 1e-7 which is too small for float16.  Without adjusting the epsilon, we will get NaN predictions because of divide by zero problems
K.set_epsilon(1e-4) 

该网络是用于音频分类的简单的4层CNN。

我的输入数据是之前生成的NumPy 3D阵列(使用LibROSA提取的音频MFCC特征(。这些数据是使用CPU生成的,我知道这些值保存为32位浮点值。

当我试图用这些数据训练我的网络时,我得到了以下错误:

TypeError:传递给"Merge"Op的"inputs"的列表中的张量的类型[foat16,float32]并不完全匹配。

在另一篇文章中,我读到我也应该"回到SoftMax层之前的FP32",是什么让事情变得更加混乱。。。

我真的很感激你的介绍。

谢谢!

在不了解模型架构的情况下,很难知道数据类型不匹配的原因。但是,我认为它在合并之前有一个BatchNorm层。

在这种情况下,合并和softmax推荐的原因是相同的,即在涉及计算统计(均值/方差(的操作期间,优选使用float32。这是因为使用float16,精度误差可能太大,会给出不准确的结果,尤其是在除法过程中。

我还没有尝试过,但在Keras(2.2.5(BatchNormalization层中,如果使用Tensorflow作为后端,方差将转换为float32。

if K.backend() != 'cntk':
sample_size = K.prod([K.shape(inputs)[axis]
for axis in reduction_axes])
sample_size = K.cast(sample_size, dtype=K.dtype(inputs))
if K.backend() == 'tensorflow' and sample_size.dtype != 'float32':
sample_size = K.cast(sample_size, dtype='float32')
# sample variance - unbiased estimator of population variance
variance *= sample_size / (sample_size - (1.0 + self.epsilon))

也许归一化后得到的张量没有转换回float16,从而导致错误。要解决此问题,您可以删除BatchNorm进行确认,然后修改keras的本地副本,或者实现一个自定义BatchNorm,该BatchNorm在规范化后会转换回"float16"。

相关内容

  • 没有找到相关文章

最新更新