2017-01-05 2 views
2

Ich möchte das Spatiotemporal Fully Convolutional Network (STFCN) in Keras implementieren. Ich muss jede Tiefenspalte einer 3D-Faltungsausgabe, z. ein Tensor mit Form (64, 16, 16), als Eingabe in ein separates LSTM.Wie man einen Tensor spaltenweise in Keras aufspalten kann, um STFCN zu implementieren

Um dies zu verdeutlichen, habe ich einen (64 x 16 x 16) Tensor der Dimensionen (channels, height, width). Ich muss den Tensor (explizit oder implizit) in 16 * 16 = 256 Tensoren der Form (64 x 1 x 1) aufteilen.

Hier ist ein Diagramm aus dem STFCN-Papier zur Veranschaulichung des Spatio-Temporal-Moduls. Was ich oben beschrieben habe, ist der Pfeil zwischen 'Spatial Features' und 'Spatio-Temporal Module'.

The connection between FCn and Spatio-Temporal Module is the relevant part of the diagram.

Wie würde diese Idee am besten in Keras umgesetzt werden?

Antwort

1

können Sie tf.split von Tensorflow verwenden Keras Lambda Schicht

Verwendung Lambda mit einem Tensor Form (64,16,16) in (64,1,1,256) zu spalten und Teilmenge dann alle Indizes, die Sie benötigen.

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) 
Verwandte Themen