python - 如何重组keras层的输出?
问题描述
我想重建我的输入层的输出形状,例如,如果它是(无,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: Graph disconnected: cannot get value for tensor Tensor("input_3:0", shape=(? , 42), dtype=float32) 在“input_3”层。访问以下先前层没有问题:['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)
推荐阅读
- javascript - 为什么我不能更新这个 JavaScript 类中的变量?
- charts - 显示不正确数据的 SSRS 饼图
- python - 在 Excel 中选择包含字符串 Pandas 的特定工作表
- flutter - Flutter Web:使用 Dio 上传视频时显示进度
- r - 在图上添加图例和更改比例
- windows - WindowsForms TopMost 与 ComboBox
- python - 创建元素(线)点的矩阵连接python
- excel - 将多个 Excel 文件附加到访问表的问题
- python - ValueError:信号仅适用于主线程python烧瓶
- bash - 将 while 循环比较存储为变量