Перестановка функций 1d массива в керасе - PullRequest
0 голосов
/ 02 марта 2020

Я хочу поменять объекты, прежде чем передать их на другой слой. У меня есть 4 переменные, поэтому мой входной массив имеет размер (#samples, 4)

Допустим, есть следующие функции: x1, x2, x3, x4

Исключенный вывод:

Обмен1: x4, x3, x2, x1

Обмен2: x2, x3, x2, x1

…. et c

Вот что я попробовал

def toy_model():    
   _input = Input(shape=(4,))
   perm = Permute((4,3,2,1)) (_input)
   dense = Dense(1024)(perm)
   output = Dense(1)(dense)

   model = Model(inputs=_input, outputs=output)
   return model

   toy_model().summary()
   ValueError: Input 0 is incompatible with layer permute_58: expected ndim=5, found ndim=2

Однако слой Permute ожидает, что массивы с несколькими измерениями будут переставлять массивы, поэтому он не выполняет свою работу. Есть ли как-нибудь решить эту проблему в кератах?

Я также пытался передать текущие функции как лямбда-слой, и я получаю ошибку

def permutation(x):
   x = keras.backend.eval(x)
   permutation = [3,2,1,0]
   idx = np.empty_like(x)
   idx[permutation] = np.arange(len(x))
   permutated = x[:,idx]
   return K.constant(permutated)

ValueError: Layer dense_93 was called with an input that isn't a symbolic tensor. Received type:                                                
<class 'keras.layers.core.Lambda'>. Full input: [<keras.layers.core.Lambda object at 
0x7f20a405f710>]. All inputs to the layer should be tensors.

1 Ответ

1 голос
/ 02 марта 2020

Используйте слой Lambda с некоторой бэкэнд-функцией или с ломтиками + конкат.

4, 3, 2, 1 :

perm = Lambda(lambda x: tf.reverse(x, axis=-1))(_input)

2, 3, 2, 1 :

def perm_2321(x):
    x1 = x[:, 0]
    x2 = x[:, 1]
    x3 = x[:, 2]

    return tf.stack([x2,x3,x2,x1], axis=-1)

perm = Lambda(perm_2321)(_input)
...