gpt4 book ai didi

TensorFlow float16 支持已损坏

转载 作者:行者123 更新时间:2023-12-03 00:38:20 25 4
gpt4 key购买 nike

最近我尝试使用 float16 在 TF 中训练 CNN。令我惊讶的是,尽管 TF 声称支持它一段时间,但它还是以各种方式被破坏。例如,无论网络如何,float16 优化都会在第二步中导致 NaN 损失。

import tensorflow as tf
import numpy as np

slim = tf.contrib.slim

dtype = tf.float16
shape = (4, 16, 16, 3)

inpt = tf.placeholder(dtype, shape, name='input')
net = slim.conv2d(inpt, 16, [3, 3], scope='conv',
weights_initializer=tf.zeros_initializer(),
# normalizer_fn=slim.batch_norm
)
loss = tf.reduce_mean(net)
opt = tf.train.AdamOptimizer(1e-3)
train_op = slim.learning.create_train_op(loss, opt)

val = np.zeros(shape)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(2):
print(sess.run(train_op, feed_dict={inpt: val}))
据我了解,这显然是一个错误:我在零输入上应用零卷积,我应该得到不会改变零损失的零梯度。它就是不能发散。如果 dtype 是 float32 则可以工作。 NaN 丢失在 CPU 和 GPU 版本上都会发生。

但是,我在 GH 问题中被解雇了,一个随机的家伙关闭了这个问题,说这是预期的行为:https://github.com/tensorflow/tensorflow/issues/7226

如果您用 BN 取消注释该行,它将在图形构建时中断,因为 BN 假定移动平均线(以及 beta、gamma)始终为 float32 并且不会正确转换它们。此问题也已关闭并显然被忽略:https://github.com/tensorflow/tensorflow/issues/7164

我感觉我正在与 ISP 的一线 IT 支持人员交谈。

当这样一个简单的“网络”严重失败时,有人可以解释我应该如何使用 float16 进行训练吗?现在报告错误的推荐方式是什么?

最佳答案

看起来您需要一个稍大的 epsilon 来避免 AdamOptimizer 中零矩的数值不稳定(默认值为 1e-8)。这对我来说适用于 float16:

opt = tf.train.AdamOptimizer(1e-3, epsilon=1e-4)

请求根据 dtype 设置 epsilon 是合理的(大概这样的请求,或者更好的是拉取请求,会在 GitHub 上得到更积极的响应)。请注意,GradientDescentOptimizer 不存在此类问题。

关于TensorFlow float16 支持已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42064941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com