Python Keras:从矩阵中的模型输出中获取最大值

Python Keras:从矩阵中的模型输出中获取最大值,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,我不太确定什么是这个问题的最佳标题,但我想将模型的输出作为另一层的输入进行处理。我目前正在做下面的工作,但想更新一下信息。为了简单起见,我简化了模型。假设我们对5x5和9通道进行输入,其输出是5x5和6通道,以及5x5和2通道 我的问题是我想处理模型\u output1,得到每个通道中的最大值,并且只有1和0(作为第二个模型的输入之一) 例如,为了简单起见,我们有一个带有3个通道的2x2 [[[0, 1], [9, 3]] [[2, 5], [5, 4]] [[4, 2],

我不太确定什么是这个问题的最佳标题,但我想将模型的输出作为另一层的输入进行处理。我目前正在做下面的工作,但想更新一下信息。为了简单起见,我简化了模型。假设我们对
5x5
9
通道进行输入,其输出是
5x5
6
通道,以及
5x5
2
通道

我的问题是我想处理
模型\u output1
,得到每个通道中的最大值,并且只有1和0(作为第二个模型的输入之一)

例如,为了简单起见,我们有一个带有3个通道的2x2

[[[0, 1],
  [9, 3]]

 [[2, 5],
  [5, 4]]

 [[4, 2],
  [8, 7]]]
我想将其转换为0和1,其中1表示相对于通道轴的最大值。因此,对于上面的示例,我想得到:

[[[0, 0],
  [1, 0]]

 [[0, 1],
  [0, 0]]

 [[1, 0],
  [0, 1]]]
我试图用
.eval()
.numpy()
模型输出1
转换为一个numpy数组,但我一直在出错。我使用的是
tensorflow gpu 2.1.0
。如果我能把它转换成numpy,我知道如何用numpy来做

另一个解决方案是只拥有两个独立的模型。在这里,我可以使用.predict获得
model\u output1
,然后对其进行操作以获得我想要的并将其输入到第二个模型。但不确定这是否有效

总之,我怎样才能将张量
模型输出1
转换成我想要的格式呢?是否可以使用一些
tf.math
函数,而不将其转换为numpy数组?如果不是,如何将其转换为numpy数组而不抛出任何错误?或者我最好的选择是使用两个不同的模型,然后再处理第一个输出。预测并处理它,使之成为我想要的输入

from keras.models import Model
from keras.layers import Dense, Conv2D, Input
from keras.layers.merge import concatenate
from keras.optimizers import Adam
import tensorflow as tf
import numpy as np

def build_model():
    model_input = Input(shape=(5, 5, 9))

    input_hidden = Conv2D(8, kernel_size=3, activation='relu', padding='same')(model_input )
    model_output1 = Dense(6, activation='softmax')(input_hidden)

    input_hidden2 = concatenate(inputs=[model_input, model_output1], axis=3)
    model_output2 = Dense(2, activation='softmax')(input_hidden2 )

    model = Model(inputs=model_input, outputs=[model_output1 , model_output2 ])

    model.compile(loss='mse', optimizer=Adam(lr=0.001))

    return model
模型摘要:

Model: "model_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 5, 5, 9)      0                                            
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 5, 5, 8)      656         input_1[0][0]                    
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 5, 5, 6)      54          conv2d_1[0][0]                   
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 5, 5, 15)     0           input_1[0][0]                    
                                                                 dense_1[0][0]                    
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 5, 5, 2)      32          concatenate_1[0][0]              
==================================================================================================
Total params: 742
Trainable params: 742
Non-trainable params: 0
__________________________________________________________________________________________________

我想很简单,你的问题是给出一个带有形状(B,m,n,c)的层输出,设计一个小模块,它给我相同形状的输出,但张量中的所有内容都是0或1(根据你的标准)。不必要的模型部分可以完全忽略

您可以在模型中使用所有
tensorflow
后端函数。以下是我设计的一个简单模块:

  • 输入层是(2,2,3)

  • 获取通道中输入的最大值(轴=-1),这将为我提供输出形状(2,2)

  • 展开“最大输出”的维度并连接以获得与输入形状相同的矩阵(2、2、3)

  • 然后,我们将+1添加到输入,并从中减去串联的最大张量

  • 它将给我们一个与输入(2,2,3)形状相同的张量,但通道最大值的每个位置现在将包含1,其他每个值将为-或0

  • 最后,我们应用
    relu
    激活来获得所需的输出

  • 输出:


    我想很简单,你的问题是给出一个带有形状(B,m,n,c)的层输出,设计一个小模块,它给我相同形状的输出,但张量中的所有内容都是0或1(根据你的标准)。不必要的模型部分可以完全忽略

    您可以在模型中使用所有
    tensorflow
    后端函数。以下是我设计的一个简单模块:

  • 输入层是(2,2,3)

  • 获取通道中输入的最大值(轴=-1),这将为我提供输出形状(2,2)

  • 展开“最大输出”的维度并连接以获得与输入形状相同的矩阵(2、2、3)

  • 然后,我们将+1添加到输入,并从中减去串联的最大张量

  • 它将给我们一个与输入(2,2,3)形状相同的张量,但通道最大值的每个位置现在将包含1,其他每个值将为-或0

  • 最后,我们应用
    relu
    激活来获得所需的输出

  • 输出:


    当我使用“from keras.layers import Input,Concatenate,Subtract,Activation”声明尝试您的解决方案时,我得到了一个错误“AttributeError:“NoneType”对象在“model=model(ip,neg2zero)”行中没有属性“\u inbound_nodes”,请使用
    tensorflow.keras
    keras
    已经有很多bug,在与
    tf
    合并后很快就会过时。另外,您清楚地提到,您使用的是
    tensorflow 2.0
    。啊,好吧,我不知道。这确实解决了这个问题,很抱歉造成混乱。但现在我得到了一个错误:ValueError:attr'T'DT_INT32与DT_FLOAT的值不一致,而使用Op输出构建nodedeef'Max':T;attr=keep_dims:bool,默认值=false;attr=T:type,allowed=[DT_FLOAT,DT_DOUBLE,DT_INT32,DT_UINT8,DT_INT16,…,DT_UINT16,DT_COMPLEX128,DT_HALF,DT_UINT32,DT_UINT64];attr=Tidx:type,default=DT_INT32,allowed=[DT_INT32,DT_INT64]>“对于行‘y=model(x)’我在google colab上运行了我的代码,它有tensorflow版本
    2.2.0-rc4
    ,运行我的确切代码会出错吗?@user1179317,是的,我能够在tensorflow 2.1中重现错误,我修复了代码。现在检查。当我使用“from keras.layers import Input,Concatenate,Subtract,Activation”声明尝试您的解决方案时,我得到一个错误“AttributeError:“NoneType”对象在“model=model(ip,neg2zero)”行中没有属性“\u inbound_nodes”,请使用
    tensorflow.keras
    keras
    已经有很多bug,在与
    tf
    合并后很快就会过时。另外,您清楚地提到,您使用的是
    tensorflow 2.0
    。啊,好吧,我不知道。这确实解决了这个问题,很抱歉造成混乱。但现在我得到了一个错误:ValueError:attr'T'DT_INT32与DT_FLOAT的值不一致,而使用Op输出构建nodedeef'Max':T;attr=keep_dims:bool,默认值=false;attr=T:type,allowed=[DT_FLOAT,DT_DOUBLE,DT_INT32
    import numpy as np
    import tensorflow as tf
    from tensorflow.keras.layers import *
    from tensorflow.keras.models import *
    
    ip = Input((2,2,3))
    mx = tf.keras.backend.max(ip, axis = -1)
    a1 = tf.expand_dims(mx, -1)
    cat = Concatenate(axis = -1)([a1, a1, a1])
    ip_add1 = tf.math.add(ip, 1)
    sub = Subtract()([ip_add1, cat])
    neg2zero = Activation('relu')(sub)
    
    model = Model(ip, neg2zero)
    
    x = np.transpose(np.array([
      [[0, 1],
      [9, 3]],
    
     [[2, 5],
      [5, 4]],
    
     [[4, 2],
      [8, 7]]], dtype = np.float32)) # your matrix need to be transposed as it had wrong order
    
    print(x)
    print(x.shape)
    y = model(x)
    print(y)
    
    [[[0 2 4]
      [9 5 8]]
    
     [[1 5 2]
      [3 4 7]]]
    (2, 2, 3)
    WARNING:tensorflow:Model was constructed with shape (None, 2, 2, 3) for input Tensor("input_20:0", shape=(None, 2, 2, 3), dtype=float32), but it was called on an input with incompatible shape (2, 2, 3).
    tf.Tensor(
    [[[0. 0. 1.]
      [1. 0. 0.]]
    
     [[0. 1. 0.]
      [0. 0. 1.]]], shape=(2, 2, 3), dtype=float32)