建立一个keras模型,将密集网络应用于3D数组中的每一列并返回2D数组

时间:2019-01-04 14:35:19

标签: python tensorflow keras

我有大量的n x m x m数组。我想训练一个可学习单个Dense NN的keras模型,以应用于所有n x 1列向量。作为一个具体示例,假设A6 x 10 x 10张量;因此,它具有100个6 x 1列向量。

我有一个训练密集神经网络的keras模型:

import keras as K
import keras.layers as L

def column_nn():
   layers=[12,36,12,1]

   columns=L.Input(shape=(6,))
   x=L.Dense(layers[0],activation='relu')(columns)
   for l in layers[1:]:
       x=L.Dense(l,activation='relu')(x)
   return K.models.Model(inputs=columns, outputs=x)

我想将其应用于100个列向量中的每一个,但是我想返回一个二维的10 x 10张量,我可以做其他事情,例如传递到Conv2D层。

想到的一种方法是使用重塑和keras共享层。

data=L.Input(shape=(6,10,10))
column_nn=column()
x=L.Permute((2,3,1))(data)
x=L.Reshape((-1,6))(x)
new_layer=column_nn()(x)
x=L.Reshape((10,10))(new_layer)
# now do a bunch of stuff to the 2-D new_layer, such as 
x=L.Conv2d(filters=5,kernel_size=[3,3])(x)
x=L.MaxPooling2D(pool_size=(2,2),strides=(2,2))(x)
x=L.Flatten(x)
output=L.Dense(x)
return K.models.Model(inputs=A,outputs=output)

看起来好吗?我想知道是否有一种轻松的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果将输入数据整形并转置到(m*m, n),则可以将Dense(k)TimeDistributed结合使用,将相同的权重分别应用于m ^ 2个向量。输出形状为(m*m, k),之后您可以重新调整形状以适合您的需求