Skip to main content
 首页 » 编程设计

python之如何重组keras层的输出

2024年11月01日1itcoder

我想重建输入层的输出形状,例如,如果它是 (None, 42),我从第一个神经元开始,取第 1 到第 7 个,然后向右滑动一个神经元,取第 2 个到第 8 位,依此类推。这样输出层将是形状 (None, 36, 7)。

我正在使用 keras.layers.Lambda() 层来执行此操作,但它无法正常工作并且尺寸不是我所期望的。我写的代码如下:

Inpt_lyr = keras.Input(shape = (42,)) 
for k in range(42 - 7 + 1): 
    F = keras.layers.Lambda(lambda x, i, j: x[:,j : j + i]) 
    F.arguments ={ 'i' : 7, 'j' : k} 
    tmp_rfrm = F(Inpt_lyr) 
    lst_rfrm.append(tmp_rfrm) 
cnctnt_lyr = keras.layers.merge.Concatenate(axis = 0)(lst_rfrm) 
tmp_dns = keras.layers.Dense(3 , activation = 'softmax')(cnctnt_lyr) 
tmp_model = Model(Inpt_lyr, tmp_dns) 
tmp_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam') 
tmp_model.summary() 

我希望 conct_lyr 的形状是 (None, 36, 7),但它是 (None,7) 它也给出了错误 ValueError:图形断开连接:无法在“input_3”层获取张量 Tensor(“input_3:0”,shape=(?, 42),dtype=float32) 的值。可以毫无问题地访问以下先前的层:['input_4']

请您参考如下方法:

你的方法对我来说看起来很明智,但张量目前正在沿着批处理轴连接,这在这种情况下是不可取的。

我建议在滑动窗口时扩展维度 1:

for k in range(42 - 7 + 1): 
    F = keras.layers.Lambda(lambda x, i, j: x[:, None, j: j + i]) 
    # F(Inpt_lyr).shape=(?, 1, 7) 

然后沿着扩展轴连接张量:

cnctnt_lyr = keras.layers.merge.Concatenate(axis=1)(lst_rfrm) 
# cnctnt_lyr.shape=(?, 36, 7)