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
后端函数。以下是我设计的一个简单模块:
relu
激活来获得所需的输出我想很简单,你的问题是给出一个带有形状(B,m,n,c)的层输出,设计一个小模块,它给我相同形状的输出,但张量中的所有内容都是0或1(根据你的标准)。不必要的模型部分可以完全忽略 您可以在模型中使用所有
tensorflow
后端函数。以下是我设计的一个简单模块:
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)