CNTK:如何从单个张量中创建一系列张量?

时间:2017-11-29 19:43:58

标签: cntk

我有一个工作的TensorFlow seq2seq模型,我一直用于图像字幕,我想将其转换为CNTK,但是我无法以正确的格式获取LSTM的输入。

以下是我在TensorFlow网络中所做的事情:

max_seq_length = 40
embedding_size = 512

self.x_img = tf.placeholder(tf.float32, [None, 2048])
self.x_txt = tf.placeholder(tf.int32, [None, max_seq_length])
self.y = tf.placeholder(tf.int32, [None, max_seq_length])        

with tf.device("/cpu:0"):
    image_embed_inputs = tf.layers.dense(inputs=self.x_img, units=embedding_size)
    image_embed_inputs = tf.reshape(image_embed_inputs, [-1, 1, embedding_size])
    image_embed_inputs = tf.contrib.layers.batch_norm(image_embed_inputs, center=True, scale=True, is_training=is_training, scope='bn')
    text_embedding = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -init_scale, init_scale))
    text_embed_inputs = tf.nn.embedding_lookup(text_embedding, self.x_txt)

inputs = tf.concat([image_embed_inputs, text_embed_inputs], 1)        

我基本上是这样做的: enter image description here

我将最后2048-dim的预训练50层ResNet层作为我输入的一部分。然后我通过一个基本的密集层(image_embed_inputs)将其嵌入到512-dim空间中。

同时,我有一个40个元素的长文本标记序列(x_txt),我将其嵌入到512个暗淡的空间(text_embedding / text_embed_inputs)。

然后我将它们连接成一个[-1, 41, 512]张量,这是我LSTM的实际输入。第一个元素([-1, 0, 512])是图像嵌入,其余40个元素([-1, 1:41, 512])是输入序列中每个文本标记的嵌入。

最终,这适用于&在TensorFlow做我需要做的事情。现在,我想在CNTK做类似的事情。我正在查看seq2seq tutorial,但我还没有弄清楚如何设置我的CNTK LSTM的输入。

我采用了2048-dim ResNet嵌入,40-dim输入文本标记序列和40-dim标签文本标记序列,并以CTF文本格式存储它们(连接ResNet嵌入和输入文本标记序列)在一起),所以他们可以这样读:

def create_reader(path, is_training, input_dim, label_dim):
    return MinibatchSource(CTFDeserializer(path, StreamDefs(
        features=StreamDef(field='x', shape=2088, is_sparse=True),
        labels=StreamDef(field='y', shape=40, is_sparse=False)
        )), randomize=is_training,
        max_sweeps=INFINITELY_REPEAT if is_training else 1)

我想在火车/考试时间做的是取features输入张量,将其分解为2048-Dim ResNet嵌入和40-Dim输入文本标记序列,然后设置CNTK序列实体将提供给我的网络。但到目前为止,我还没弄清楚如何做到这一点。这就是我所在的地方:

def lstm(input, embedding_dim, LSTM_dim, cell_dim, vocab_dim):
    x_image = C.slice(input, 0, 0, 2048)
    x_text = C.slice(input, 0, 2048, 2088)

    x_text_seq = sequence.input_variable(shape=[vocab_dim], is_sparse=False)

    # How do I get the data from x_text into x_text_seq?

    image_embedding = Embedding(embedding_dim)
    text_embedding = Embedding(x_text_seq)
    lstm_input = C.splice(image_embedding, text_embedding)

我不确定如何正确设置序列 - 任何想法?

0 个答案:

没有答案