gpt4 book ai didi

arrays - 在keras中实现切片层

转载 作者:行者123 更新时间:2023-12-03 08:48:52 30 4
gpt4 key购买 nike

(免责声明:我已将问题简化为要点,我想做的稍微复杂一些,但我在这里描述了核心问题。)

我正在尝试使用 keras 构建一个网络来学习一些 5 x 5 矩阵的属性。

输入数据采用 1000 x 5 x 5 numpy 数组的形式,其中每个 5 x 5 子数组代表一个矩阵。

我希望网络做的是使用矩阵中每一行的属性,因此我想将每个 5 x 5 数组拆分为单独的 1 x 5 数组,并将这 5 个数组中的每一个传递到下一个数组网络的一部分。

这是我到目前为止所拥有的:

input_mat = keras.Input(shape=(5,5), name='Input')

part_list = list()
for i in range(5):
part_list.append(keras.layers.Lambda(lambda x: x[i,:])(input_mat))

dense_list = list()
for i in range(5):
dense_list.append( keras.layers.Dense(10, activation='selu',
use_bias=True)(part_list[i]) )


conc = keras.layers.Concatenate(axis=-1, name='Concatenate')(dense_list)
dense_out = keras.layers.Dense(1, name='D_out', activation='sigmoid')(conc)


model = keras.Model(inputs= input_mat, outputs=dense_out)
model.compile(optimizer='adam', loss='mean_squared_error')

我的问题是,这似乎训练得不好,并且查看模型摘要,我不确定网络是否按照我的意愿分割输入:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
Input (InputLayer) (None, 5, 5) 0
__________________________________________________________________________________________________
lambda_5 (Lambda) (5, 5) 0 Input[0][0]
__________________________________________________________________________________________________
lambda_6 (Lambda) (5, 5) 0 Input[0][0]
__________________________________________________________________________________________________
lambda_7 (Lambda) (5, 5) 0 Input[0][0]
__________________________________________________________________________________________________
lambda_8 (Lambda) (5, 5) 0 Input[0][0]
__________________________________________________________________________________________________
lambda_9 (Lambda) (5, 5) 0 Input[0][0]
__________________________________________________________________________________________________
dense (Dense) (5, 10) 60 lambda_5[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (5, 10) 60 lambda_6[0][0]
__________________________________________________________________________________________________
dense_2 (Dense) (5, 10) 60 lambda_7[0][0]
__________________________________________________________________________________________________
dense_3 (Dense) (5, 10) 60 lambda_8[0][0]
__________________________________________________________________________________________________
dense_4 (Dense) (5, 10) 60 lambda_9[0][0]
__________________________________________________________________________________________________
Concatenate (Concatenate) (5, 50) 0 dense[0][0]
dense_1[0][0]
dense_2[0][0]
dense_3[0][0]
dense_4[0][0]
__________________________________________________________________________________________________
D_out (Dense) (5, 1) 51 Concatenate[0][0]
==================================================================================================
Total params: 351
Trainable params: 351
Non-trainable params: 0

Lambda 层的输入和输出节点在我看来是错误的,尽管我担心我仍然很难理解这个概念。

最佳答案

应避免使用 Lambda。

改为子类层:

class Slice(keras.layers.Layer):
def __init__(self, begin, size,**kwargs):
super(Slice, self).__init__(**kwargs)
self.begin = begin
self.size = size
def get_config(self):

config = super().get_config().copy()
config.update({
'begin': self.begin,
'size': self.size,
})
return config
def call(self, inputs):
return tf.slice(inputs, self.begin, self.size)

关于arrays - 在keras中实现切片层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168142/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com