Простой пользовательский слой в керасе, путаница тензорного потока - PullRequest
0 голосов
/ 25 сентября 2019

Прежде чем я объясню, вот соответствующий фрагмент кода:

input = Input(shape=(784, ))
hidden1 = Dense(784, activation='relu')(input)
hidden2 = Dense(784, activation='relu')(hidden1)
hidden3 = Dense(1568, activation='relu')(hidden2)
hidden4 = Lambda(lambda x: makeComplex(x))(hidden3)
hidden5 = Reshape((1, 28, 28))(hidden4)
hidden6 = Lambda(lambda x: ifft2(x))(hidden5)
hidden7 = Flatten()(hidden6)
output = Dense(train_targets.shape[1], activation='linear')(hidden7)
model = Model(inputs=input, outputs=output)
print(model.summary())

, где ifft2 (x) равно

def ifft2(x):
    import tensorflow as tf
    return tf.cast(tf.spectral.ifft2d(tf.cast(x,dtype=tf.complex64)),tf.float32)

Теперь моя цель - реализовать метод makeComplex.

По сути, он получает вектор размером 1568, и я хочу, чтобы он возвращал вектор размера 784 следующим очень простым способом:

new[k] = old[k] + old[k + 1] * i, где i - мнимая единица

Вот моя попытка:

def makeComplex(x):
    y = np.zeros((1, 784))
    for i in range(784):
        y[i] = np.complex(x[i], x[i + 1])
    return y

Конечно, это не работает, потому что x на самом деле не вектор, а тензор тензора.Что-то, о чем я ничего не знаю.Как я могу сделать эту работу?

1 Ответ

0 голосов
/ 25 сентября 2019

Пример тензора [1., 2., 3., 4.], Который вы хотите, это [1. + 2.j, 3. + 4.j].Я думаю, вы можете использовать tf.gather, чтобы получить два тензора [1.,2.] и [3.,4.], а затем использовать tf.complex, чтобы получить ответ.

import tensorflow as tf
import numpy as np

a = tf.constant([1.,2.,3.,4.])
real = tf.gather(a,np.arange(0,a.get_shape().as_list()[0],2)) 
imag = tf.gather(a,np.arange(1,a.get_shape().as_list()[0],2))

res = tf.complex(real, imag)
...