Keras自定义图层2D输入 - > 2D输出

时间:2017-02-10 08:32:38

标签: machine-learning neural-network keras keras-layer

我有一个2D输入(如果考虑样本的数量,则为3D),我想应用一个keras层来获取此输入并输出另一个2D矩阵。因此,例如,如果我有一个大小(ExV)的输入,学习权重矩阵将是(SxE)和输出(SxV)。我可以用密集层做到这一点吗?

编辑(Nassim请求):

第一层无所事事。它只是为Lambda层提供输入:

from keras.models import Sequential
from keras.layers.core import Reshape,Lambda
from keras import backend as K
from keras.models import Model

input_sample = [
[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]
,[[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35],[36,37,38,39,40]]
,[[41,42,43,44,45],[46,47,48,49,50],[51,52,53,54,55],[56,57,58,59,60]]
]


model = Sequential()
model.add(Reshape((4,5), input_shape=(4,5)))
model.add(Lambda(lambda x: K.transpose(x)))
intermediate_layer_model = Model(input=model.input,output=model.layers[0].output)
print "First layer:"
print intermediate_layer_model.predict(input_sample)
print ""
print "Second layer:"
intermediate_layer_model = Model(input=model.input,output=model.layers[1].output)
print intermediate_layer_model.predict(input_sample)

2 个答案:

答案 0 :(得分:2)

这取决于你想做什么。它是2D,因为它是一个序列?然后为此制作LSTM,如果设置了return_sequence = True,将返回所需大小的序列。

CNN还可以处理2D输入,并根据您使用的内核数量输出可变大小的内容。

否则你可以将它重新整形为(E x V,)1D张量,使用具有SxV尺寸的密集层并将输出重新整形为(S,V)2D张量......

我无法帮助你,我们需要知道你的用例:-)神经网络的可能性太大了。

编辑:

您可以使用TimeDistributed(Dense(S))。 如果您的输入具有形状(E,V),则您将重塑为(V,E)以将V作为“时间维度”。然后应用TimeDistributed(Dense(S)),它将是一个具有权重(ExS)的密集层,输出将具有形状(V,S),因此您可以将其重新整形为(S,V)。

这会成为你想要的吗? TimeDistributed()图层将使用共享权重将相同的Dense(S)图层应用于输入的每个V行。

编辑2:

在查看keras后端的代码之后,事实证明,使用tensorflow的转置和'permutation patterns'选项可用,你需要使用K.permute_dimensions(x,pattern)。必须包含批次维度。在你的情况下:

Lambda(lambda x: K.permute_dimensions(x,[0,2,1]))

K.transpose(x)在内部使用相同的函数(对于tf后端),但是置换被设置为默认值[n,n-1,...,0]。

答案 1 :(得分:1)

你想要的可能是autoencoder。

https://blog.keras.io/building-autoencoders-in-keras.html