【发布时间】:2021-02-21 19:37:58
【问题描述】:
我正在尝试在我的损失函数中对预测进行一个热编码。
def loss(y_true, y_pred, smooth=1e-7):
y_true = K.flatten(y_true)
y_true = one_hot(y_true, n_classes)
y_pred = softargmax(y_pred)
y_pred = K.flatten(y_pred)
y_pred = one_hot(y_pred, n_classes)
intersect = K.sum(y_true * y_pred, axis=-1)
denom = K.sum(y_true + y_pred, axis=-1)
return K.mean((2. * intersect / (denom + smooth)))
但是将y_pred 转换为int32 以便使用内置的K.one_hot 导致
ValueError: No gradients provided for any variable:
错误。所以我编写了自己的 one_hot 编码方法,避免将y_pred 转换为int32
def one_hot(xs, n_classes):
table = tf.eye(n_classes, dtype=tf.dtypes.float32)
return tf.map_fn(lambda x: table[tf.raw_ops.Cast(x=x, DstT=tf.int32)], xs)
one_hot(tf.constant([0.0, 1.0, 2.0]), 3)
我的问题如下。使用tf.gather/gatner_nd 会导致相同的梯度错误,我能找到的唯一能在不导致梯度错误的情况下工作的函数是tf.map_fn,它非常缓慢地切换到vectorized_map,再次导致梯度错误。是否有另一种方法可以对具有渐变的热编码?
【问题讨论】:
-
为什么不直接使用
tf.one_hot()? -
@gobrewers14 正如我在 one_hot 工作的问题中所写 y_pred 必须强制转换为 int32 操作没有渐变,因此不起作用
标签: python tensorflow machine-learning deep-learning tensor