Numpy 将模型输出替换为二进制形式

Numpy 将模型输出替换为二进制形式,numpy,tensorflow,Numpy,Tensorflow,我有这样的模型输出, >但我想将数组中的最大值改为1,其他值改为0。如果有两个或更多最大值,则应将其更改为零数组 例如: [0.92, 0.2 , 0.77] -> [1.0,0.0,0.0], [0.92, 0.92 , 0.77] -> [0.0,0.0,0.0] 我知道如何通过np.argmax实现,但我想通过keras.layers实现这一点,因为在这之后总结输出,并希望以二进制模式实现 我已经做了这样的自定义层,但不幸的是无法编译它 class Amplifier(tf.

我有这样的模型输出, >但我想将数组中的最大值改为1,其他值改为0。如果有两个或更多最大值,则应将其更改为零数组

例如:

[0.92, 0.2 , 0.77] -> [1.0,0.0,0.0],
[0.92, 0.92 , 0.77] -> [0.0,0.0,0.0]
我知道如何通过np.argmax实现,但我想通过keras.layers实现这一点,因为在这之后总结输出,并希望以二进制模式实现

我已经做了这样的自定义层,但不幸的是无法编译它

class Amplifier(tf.keras.layers.Layer):
    def __init__(self):
        super(Amplifier, self).__init__()
        # pattern 2D matrix
        self.f = tf.constant(
            [[1., 0., 0.],
             [0., 1., 0.],
             [0., 0., 1.]], dtype='float32')

    def call(self, inputs, training=None, mask=None):
        # return index of max value
        x = tf.math.argmax(
            inputs,
            axis=None,
            output_type=tf.dtypes.int32,
            name=None)
        # get factor from f constant as 1D matrix form
        y = tf.reshape(tf.slice(self.f, [x, 0], [1, 3]), [3])
        # multiply input on the pattern matrix
        return tf.math.multiply(inputs, y) 
我得到了这个错误:

ValueError:尝试将“begin”转换为张量,但失败。错误:形状的秩必须相等,但为1和0 将形状0与其他形状合并。对于{{节点放大器/片/压缩}}=Pack[N=2,T=DT_INT32,轴=0]放大器/ArgMax,放大器/片/压缩/1',输入形状:[3],]


我不知道如何避免这个错误

我想你要问的是,你的输出格式是否正确?。如果您只想报告此输出,则可以使用argmax和one_hot的组合。如果你想让它成为你网络中梯度计算的一部分,你需要一个数值稳定的。试着这样做:

导入tensorflow作为tf 从tensorflow.keras导入图层 从tensorflow.keras.layers导入稠密 一类HotLayers图层。图层: def_uuuinit_uuuself,num_labels=3,do_numerical=False: 超级__ 用于掩蔽softmax的大常数 自身。inf=1e9 我们有多少种类 self.num\u labels=num\u labels 如果我们需要我们的“一热”是数值稳定的 self.do\u numeral=do\u numeral 致密层;我们网络的最后一层 self.probs=denseseself.num_标签,激活=softmax 这是一种数值稳定的“一热”方法。 它查找行间的最大值,然后从 原始张量跨行和指数。 这将使最大值为1.0。然后我们创建一个 跨行屏蔽并再次归零所有其他值 给我们留下一个二进制矩阵。 def _数值_一_热自,x: m=tf.math.reduce_maxx,轴=1,keepdims=True e=tf.math.expx-m 掩码=tf.casttf.math.not_equale,1.0,tf.float32 x=x-自身。_inf*掩码 返回tf.nn.softmaxx,轴=1 def callself,x: 向前穿过最后一层吗 x=自我问题x 我们需要数值稳定性吗?如果我们使用 我们创建的op。如果没有,则将argmax穿过 行,然后使用'tf.one_hot';两者都返回 ohx=自身数值\ 如果self.do\u\ else tf.one_hottf.math.argmaxx,axis=1,self.num_标签 返回x,ohx 数据:

假数据 X=tf.random.normal[8,10] y=tf.random.uniform 形状=[8,], minval=0, maxval=3, dtype=tf.int64 y=tf.one_hoty,3 测试数值稳定性网络:

具有稳定的一个热网络 x_in=tf.keras.Input10, x=密度25x_英寸 x_probs,x_index=OneHotLayer3,Truex ^ ------------------| 模型 model=tf.keras.Modelx_in[x_probs,x_index] probs,idxs=modelX ^^^如果需要,可以在损耗计算中使用 打印问题 tf张量 [[0.12873407 0.83047885 0.04078702] [0.22919412 0.1288479 0.641958 ] [0.27402356 0.35891128 0.36706516] [0.1328154 0.3546107 0.51257384] [0.5309519 0.10788985 0.36115825] [0.35019153 0.272698 0.37711048] [0.35740596 0.23807809 0.4045159 ] [0.13749316 0.72042704 0.14207976]], 形状=8,3,数据类型=32 printidxs tf张量 [[0. 1. 0.] [0. 0. 1.] [0. 0. 1.] [0. 0. 1.] [1. 0. 0.] [0. 0. 1.] [0. 0. 1.] [0. 1. 0.]], 形状=8,3,数据类型=32 测试内置的一个热网络:

网络使用argmax和内置的单_热 x_in=tf.keras.Input10, x=密度25x_英寸 x_probs,x_index=OneHotLayer3,false x ^ ------------------| 模型 model=tf.keras.Modelx_in[x_probs,x_index] probs,idxs=modelX 打印问题 tf张量 [[0.28931475 0.33777648 0.3729088 ] [0.25985113 0.532114 0.20803489] [0.4226228 0.21078317 0.36659405] [0.460703 0.3534157 0.18588138] [0.6028035 0.26571727 0.13147917] [0.1994377 0.4208928 0.37966955] [0.39812535 0.33319235 0.26868224] [0.13242716 0.47491995 0.3926528 ]], 形状=8,3,数据类型=32 printidxs tf张量 [[0. 0. 1.] [0. 1. 0.] [1. 0. 0.] [1. 0. 0.] [1. 0. 0.] [0. 1. 0.] [1. 0. 0.] [0. 1. 0.]], 形状=8,3,数据类型=32
我怀疑keras.layers是否可能,为什么不能在网络输出上使用tf.nn.softmax?因为它只在限制1中规范化值。例如inputf.nn.softmaxtf.constant[0.79,0.72,0.41],dtype='float64',axis=None,name=None->tf.Tensor[0.38222571 0.35638489 0.26138941],shape=3,,dtype=float64Oh我明白了。如果你能编辑你的问题,详细解释你想发生什么,我可以给你看
如何做。一切都很好,但不幸的是我失去了输出形状。现在我没有,没有用于“idxs”的,但是应该没有,3。是否可以保存表单或手动设置表单。谢谢。我不使用“数值稳定”所以去掉了稠密层和x输出