我有一个工作的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)
我将最后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)
我不确定如何正确设置序列 - 任何想法?