在Keras或Tensorflow中构建一个图层来重塑和修改输入

时间:2017-05-12 16:04:52

标签: tensorflow keras

以下是步骤。

  1. 图层获取输入,将其命名为输入A,其形状为(无,5,5,100)。
  2. 重塑A到(无,25,100)
  3. 将A复制到B
  4. 将B转置为形状(无,100,25)
  5. 点B和A(批量维度除外)并得到结果C,其形状为(无,100,100)
  6. 将C重塑为(无,100,100,1)
  7. 火炬很容易,但是我必须在keras中实现它,所以我不知道。这让我困惑了两个多星期。

1 个答案:

答案 0 :(得分:0)

给出一个输入:

from keras.layers import *


inp = Input((5,5,100)) #or the output of a layer coming before this

out = Reshape((25,100))(inp)   
out = Lambda(operation, output_shape = (100,100))(out)
out = Reshape((100,100,1))(out) 

操作地点:

import keras.backend as K

def operation(x):
    xT = K.permute_dimensions(x,(0,2,1)) #batch axes 0 is kept, 1 and 2 are swaped    
    return K.batch_dot(x,xT,axes=[1,2])

如果您正在使用顺序模型:

model.add(Reshape(25,100))
model.add(Lambda(operation, output_shape = (100,100)))
model.add(Reshape((100,100,1)))

如果你想要一个单层内的所有东西:

def operation(x):
    x2 = K.reshape(x,(25,100))
    x2T = K.permute_dimensions(x,(0,2,1))
    d = K.batch_dot(x2,x2T,axes=[1,2])
    return K.reshape(d,(100,100,1))

myLayer = Lambda(operation, output_shape=(100,100,1))

如果您想要该图层的多个实例:

def myLayer():
    return Lambda(operation, output_shape=(100,100,1))