#python #tensorflow
Вопрос:
У меня есть ограниченная комбинаторная задача, в которой, скажем, непрерывный вектор $x в [0,1]^n$ должен быть спроецирован в дискретный $y = {0,1}^n$ по простому правилу y_i = 1, если x_1 > 0,5.
Однако y ограничен таким образом, что сумма(y) Я не уверен, что гарантирую сумму(x)
Моя главная цель-спроецировать x на плоскость L1norm(x) = сумма(x) = k, если сумма(x) > k. Есть ли способ сделать это в tensorflow. Клип по норме позволяет делать это на основе нормы L2. Могу ли я соответствующим образом изменить код здесь (https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/clip_ops.py#L154-L235) для случая L1?
# Calculate L2-norm, clip elements by ratio of clip_norm to L2-norm
l2sum = math_ops.reduce_sum(values * values, axes, keepdims=True)
pred = l2sum > 0
# Two-tap tf.where trick to bypass NaN gradients
l2sum_safe = array_ops.where(pred, l2sum, array_ops.ones_like(l2sum))
l2norm = array_ops.where(pred, math_ops.sqrt(l2sum_safe), l2sum)
intermediate = values * clip_norm
# Assert that the shape is compatible with the initial shape,
# to prevent unintentional broadcasting.
values.shape.assert_is_compatible_with(intermediate.shape)
values_clip = array_ops.identity(
intermediate / math_ops.maximum(l2norm, clip_norm), name=name)
if isinstance(t, ops.IndexedSlices):
return ops.IndexedSlices(values_clip, t.indices, t.dense_shape)
return values_clip