Keras 自定义图层 2D 输入 -> 2D 输出
Keras Custom Layer 2D input -> 2D output
我有一个 2D 输入(如果考虑样本数量,则为 3D),我想应用一个 keras 层来获取此输入并输出另一个 2D 矩阵。因此,例如,如果我有一个大小为 (ExV) 的输入,则学习权重矩阵将为 (SxE) 和输出 (SxV)。我可以用 Dense 层来做这个吗?
编辑(纳西姆请求):
第一层什么都不做。只是给 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)
你要的应该是autoencoder
这取决于你想做什么。它是二维的,因为它是一个序列吗?然后 LSTM 就是为此而制作的,如果你设置 return_sequence=True.return 一个需要大小的序列。
CNN 也可以处理 2D 输入,并根据您使用的内核数量输出可变大小的内容。
否则,您可以将其重塑为 (E x V, ) 1D 张量,使用具有 SxV 维度的 Dense 层并将输出重塑为 (S,V) 2D 张量...
我帮不了你了,我们需要了解你的用例:-)神经网络有太多的可能性。
编辑:
您可以使用 TimeDistributed(Dense(S))。
如果您的输入具有形状 (E,V),您可以重塑为 (V,E) 以将 V 作为“时间维度”。然后你应用 TimeDistributed(Dense(S)) 这将是一个具有权重 (ExS) 的致密层,输出将具有 (V,S) 的形状,因此你可以将其重塑为 (S,V)。
这就是你想要的吗? TimeDistributed() 层将对具有共享权重的输入的每 V 行应用相同的 Dense(S) 层。
编辑 2:
查看keras后端的代码后发现,要使用'permutation patterns'选项可用的tensorflow转置,需要使用K.permute_dimensions(x,pattern)。必须包含批次维度。在你的情况下:
Lambda(lambda x: K.permute_dimensions(x,[0,2,1]))
K.transpose(x) 在内部使用相同的函数(对于 tf 后端)但排列设置为默认值 [n,n-1,...,0].
我有一个 2D 输入(如果考虑样本数量,则为 3D),我想应用一个 keras 层来获取此输入并输出另一个 2D 矩阵。因此,例如,如果我有一个大小为 (ExV) 的输入,则学习权重矩阵将为 (SxE) 和输出 (SxV)。我可以用 Dense 层来做这个吗?
编辑(纳西姆请求):
第一层什么都不做。只是给 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)
你要的应该是autoencoder
这取决于你想做什么。它是二维的,因为它是一个序列吗?然后 LSTM 就是为此而制作的,如果你设置 return_sequence=True.return 一个需要大小的序列。
CNN 也可以处理 2D 输入,并根据您使用的内核数量输出可变大小的内容。
否则,您可以将其重塑为 (E x V, ) 1D 张量,使用具有 SxV 维度的 Dense 层并将输出重塑为 (S,V) 2D 张量...
我帮不了你了,我们需要了解你的用例:-)神经网络有太多的可能性。
编辑:
您可以使用 TimeDistributed(Dense(S))。 如果您的输入具有形状 (E,V),您可以重塑为 (V,E) 以将 V 作为“时间维度”。然后你应用 TimeDistributed(Dense(S)) 这将是一个具有权重 (ExS) 的致密层,输出将具有 (V,S) 的形状,因此你可以将其重塑为 (S,V)。
这就是你想要的吗? TimeDistributed() 层将对具有共享权重的输入的每 V 行应用相同的 Dense(S) 层。
编辑 2:
查看keras后端的代码后发现,要使用'permutation patterns'选项可用的tensorflow转置,需要使用K.permute_dimensions(x,pattern)。必须包含批次维度。在你的情况下:
Lambda(lambda x: K.permute_dimensions(x,[0,2,1]))
K.transpose(x) 在内部使用相同的函数(对于 tf 后端)但排列设置为默认值 [n,n-1,...,0].