Python isinstance()检查张量上的Keras层类型

Python isinstance()检查张量上的Keras层类型,python,tensorflow,input,keras,deep-learning,Python,Tensorflow,Input,Keras,Deep Learning,我得到一个模型的预建Keras层列表,如下所示: def build_model(layers): 我想构建一个Keras功能API模型a: model = Model(inputs, outputs) 因此,为了实现这一目标,我使用了: inputs = list() outputs = list() for layer in layers: if isinstance(layer, keras.layers.Input): inputs.append(layer)

我得到一个模型的预建Keras层列表,如下所示:

def build_model(layers):
我想构建一个Keras功能API模型a:

model = Model(inputs, outputs)
因此,为了实现这一目标,我使用了:

inputs = list()
outputs = list()
for layer in layers:
    if isinstance(layer, keras.layers.Input):
        inputs.append(layer)
    else:
        outputs.append(layer)
但问题是,预构建的Keras输入层不再保存数据类型:Input,而是一个类似于so的张量:

张量(“输入1:0”,形状=(无,无,无),数据类型=浮点32)

有没有解决办法。不幸的是,函数签名无法更改,但是如果有解决方法,请告诉我(这里真的卡住了)


提前感谢。

由于函数
isinstance
出现问题,我们可以使用层的
名称来解决此问题

例如,让我们使用以下代码构建一个简单的模型:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Dropout, Input
from tensorflow import keras

x = Input(shape=(32,))
y = Dense(16, activation='softmax')(x)
model = Model(x, y)
让我们使用命令,
model.summary()
验证架构,如下所示:

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 32)]              0         
_________________________________________________________________
dense_1 (Dense)              (None, 16)                528       
=================================================================
Total params: 528
Trainable params: 528
Non-trainable params: 0
layers = model.layers
inputs = []
outputs = []

for layer in layers:
  # Check if a Layer is an Input Layer using its name
  if 'input' in layer.name:
    inputs.append(layer)
  else:
    outputs.append(layer)

print('Inputs List is ', inputs)
print('Outputs List is ', outputs)
如果我们观察图层名称,
Input Layer
的前缀为Input

或者换句话说,代码

print('Name of First Layer is ', layers[0].name)
print('Name of Second Layer is ', layers[1].name)
导致

Name of First Layer is  input_2
Name of Second Layer is  dense_1
因此,我们可以修改我们的逻辑,如下所示:

Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 32)]              0         
_________________________________________________________________
dense_1 (Dense)              (None, 16)                528       
=================================================================
Total params: 528
Trainable params: 528
Non-trainable params: 0
layers = model.layers
inputs = []
outputs = []

for layer in layers:
  # Check if a Layer is an Input Layer using its name
  if 'input' in layer.name:
    inputs.append(layer)
  else:
    outputs.append(layer)

print('Inputs List is ', inputs)
print('Outputs List is ', outputs)
上述代码的输出为:

Inputs List is  [<tensorflow.python.keras.engine.input_layer.InputLayer object at 0x7fef788154e0>]
Outputs List is  [<tensorflow.python.keras.layers.core.Dense object at 0x7fef78845fd0>]
输入列表为[]
输出列表为[]

希望这有帮助。学习愉快

您好@Ramsha Siddiqui,请提供更多关于您的模型的详细信息以及最低可复制代码。您好!是的,这就是我最后使用的。谢谢分享!