Как разбить тензор по столбцам в Keras для реализации STFCN

Я хотел бы реализовать пространственно-временную полностью сверточную сеть (STFCN) в Керасе. Мне нужно передать каждый столбец глубины 3D-сверточного вывода, например. тензор формы (64, 16, 16) в качестве входных данных для отдельного LSTM.

Чтобы было понятно, у меня есть тензор (64 x 16 x 16) размерностей (channels, height, width). Мне нужно разбить (явно или неявно) тензор на 16 * 16 = 256 тензоров формы (64 x 1 x 1).

Вот диаграмма из документа STFCN, иллюстрирующая пространственно-временной модуль. То, что я описал выше, — это стрелка между «Пространственными функциями» и «Пространственно-временным модулем».

«Связь

Как эту идею лучше всего реализовать в Керасе?


person jhuang    schedule 05.01.2017    source источник


Ответы (1)


Вы можете использовать tf.split из Tensorflow, используя слой Keras Lambda

Используйте Lambda, чтобы разделить тензор формы (64,16,16) на (64,1,1,256), а затем подмножить любые нужные вам индексы.

import numpy as np
import tensorflow as tf
import keras.backend as K
from keras.models import  Model
from keras.layers import Input, Lambda

# input data
data = np.ones((3,64,16,16))

# define lambda function to split
def lambda_fun(x) : 
    x = K.expand_dims(x, 4)
    split1 = tf.split(x, 16, 2)
    x = K.concatenate(split1, 4)
    split2 = tf.split(x, 16, 3)
    x = K.concatenate(split2, 4)
    return x

## check thet splitting works fine
input = Input(shape= (64,16,16))
ll = Lambda(lambda_fun)(input)
model = Model(inputs=input, outputs=ll)
res = model.predict(data)
print(np.shape(res))    #(3, 64, 1, 1, 256)
person Vadym B.    schedule 08.11.2017