背景:I有两个顺序模型,它们形成一个单一模型,格式如下
model = Sequential([seq_model1, seq_model2])
seq_model1
的输出是预先确定的,因此它是tf.Tensor(shape=(None,5), dtype=float32)
。因此,seq_model2
的输入可以写成keras.layers.Input(shape(5,))
。
如何访问Input()
seq_model2
**?**的层的各个输入元素?
Input()
对象充当传入数据的占位符,因此它实际上没有任何可以访问的元素。这是通过以下代码进行验证的:
# Define arbitrary input layer
inputs = keras.layers.Input(shape=(5,)) # Returns -> <KerasTensor: shape=(None, 5) dtype=float32>
# Attempt to access an individual element
a = inputs[0] # Returns -> <KerasTensor: shape=(5,) dtype=float32>
# Access an element outside the known shape range
b = inputs[20] # Returns -> <KerasTensor: shape=(5,) dtype=float32>
我们可以看到,inputs
在传统意义上是不可迭代的,无论您调用它的第一个元素a
还是在已知范围之外的元素b
,它都返回与inputs
相同形状的tf.Tensor
。我希望我的seq_model2
能够访问inputs
的各个元素,以执行依赖于上述单个元素的自定义计算。
Input
甚至可以从层访问单个值吗?或者,由于Input()
只是占位符而不是实际的可迭代张量,所以目前不支持这种操作吗?
发布于 2022-11-07 21:28:55
所以,让我们从顺序模型开始,现在,考虑我在keras中有两个顺序模型,如下所示,
clear_session()
model1 = keras.Sequential([
keras.layers.Input(shape=(224,224,3)),
keras.layers.Conv2D(64, 3, padding='same'),
keras.layers.Dense(3, activation='softmax')
])
#clear_session()
model2 = keras.Sequential([
keras.layers.Input(shape=(128,128,1)),
keras.layers.Conv2D(64, 3, padding='same'),
keras.layers.Dense(3, activation='softmax')
])
现在,我必须把这两个顺序模型合并为一个,
final_model = keras.Sequential([model1, model2])
现在,我可以作为一个单独的层访问这两个模型,如下所示,
final_model.layers[0].summary()
#Summary of model 1
final_model.layers[1].summary()
#Summary of Model 2
我还可以像上面一样检索每个模型的各个层,例如,我也可以访问模型2的输入层。
final_model.layers[1].layers[0].input
输出:
<KerasTensor: shape=(None, 128, 128, 1) dtype=float32 (created by layer 'input_2')>
要访问层的Ith元素,请执行以下操作
#To Access the Output of *ith* element of any layer is
# if my input size is (64, 224, 224, 3)
# then 64 -> batch-size
# (224, 224) -> (width, height)
# 3 -> no of channels
# e.g. so, here if I want to access all the elements of #batch no 10 then I will do...
final_model.layers[1].layers[0].output[i,:,:,:] # i = 10
输出
<KerasTensor: shape=(128, 128, 1) dtype=float32 (created by layer 'tf.__operators__.getitem_4')>
#To access the input of *ith* element of any layer is
#Same as before but this time I want to access the last #channel of model along all the batches
final_model.layers[1].layers[0].input[:,:,:,-1] # i = -1
输出
<KerasTensor: shape=(None, 128, 128) dtype=float32 (created by layer 'tf.__operators__.getitem_5')>
https://stackoverflow.com/questions/74350888
复制