TensorFlowのCNN-LSTMネットワークをCNTKにキャプションする作業イメージを変換しようとしていますが、私は正しく訓練されたモデルだと思っていますが、最終的に訓練されたCNTKモデルから予測を抽出する方法がわかりません。CNTK:LSTM非表示状態を初期化するにはどうすればよいですか?
これは、私が働いている一般的なアーキテクチャである:これは私のCNTKモデルです :
def create_lstm_model(image_features, text_features):
embedding_dim = 512
hidden_dim = 512
cell_dim = 512
vocab_dim = 77
image_embedding = Embedding(embedding_dim)
text_embedding = Embedding(embedding_dim)
lstm_classifier = Sequential([Stabilizer(),
Recurrence(LSTM(hidden_dim)),
Recurrence(LSTM(hidden_dim)),
Stabilizer(),
Dense(vocab_dim)])
embedded_images = BatchNormalization()(image_embedding(image_features))
embedded_text = text_embedding(text_features)
lstm_input = C.plus(embedded_images, embedded_text)
lstm_input = C.dropout(lstm_input, 0.5)
output = lstm_classifier(lstm_input)
return output
私は、40の固定キャプションシーケンスの大きさで、CTF形式で自分のデータを提供し使用していますこのような構造:別に
def create_reader(path, is_training):
return MinibatchSource(CTFDeserializer(path, StreamDefs(
target_tokens = StreamDef(field='target_tokens', shape=vocab_len, is_sparse=True),
input_tokens = StreamDef(field='input_tokens', shape=vocab_len, is_sparse=True),
image_features = StreamDef(field='image_features', shape=image_features_dim, is_sparse=False)
)), randomize = is_training, max_sweeps = INFINITELY_REPEAT if is_training else 1)
:3つのデータストリームのための理由は、 - Iは、入力された画像特徴ベクトル(事前訓練ResNetの最後2048 DIM層)、入力されたテキスト・トークンの配列を有し、そしてのシーケンスutputテキストトークン。そこで、基本的シーケンスの面で私のCTFファイルは、次のようになります。
基本的に0 | target_token_0 | input_token_0 | input_image_feature_vector (2048-dim)
0 | target_token_1 | input_token_1 | empty array of 2048 zeros
0 | target_token_2 | input_token_2 | empty array of 2048 zeros
...
0 | target_token_40 | input_token_40 | empty array of 2048 zeros
1 | target_token_0 | input_token_0 | input_image_feature_vector (2048-dim)
1 | target_token_1 | input_token_1 | empty array of 2048 zeros
1 | target_token_2 | input_token_2 | empty array of 2048 zeros
...
1 | target_token_40 | input_token_40 | empty array of 2048 zeros
、私は(あなたが簡単に2つのテンソルをスプライスすることができていても)CNTKで一緒に&スプライス二つの配列をスライスする方法を見つけ出すことができませんでした、シーケンスの最初の要素だけを入力2048次元の画像の特徴ベクトルで、シーケンスの残りの要素を空の2048次元の0のベクトルに設定することでハッキングしています。
C.plus(embedded_images, embedded_text)
上記のモデルでは、目標は基本的に最初の要素を取ることです40 画像埋め込みのシーケンスと、ハックスプライス(TM)のシーケンスの最後の39個のエレメントの前に、4[vocab_dim]->[512]
ワードの埋め込みのシーケンスがある。空の画像ベクトル(2048のゼロ)のためにかなりの空きの[2048]->[512]
画像埋め込みがあるので、埋め込まれた画像シーケンスと要素的に埋め込みテキストシーケンスにLSTMに入る前に追加していきます。基本的に、これは:
image embedding sequence: [-1, 40, 512] (e.g., [-1, 0, 512])
text embedding sequence: [-1, 40, 512] (e.g., [-1, 1:40, 512)
+
---------------------------------------
lstm input sequence: [-1, 40, 512]
私の実際の質問に私をもたらします。今、私はちゃんとうまく訓練したモデルを持っていることを、私は基本的に(このPyTorch image captioning tutorialから)このような何かをやって、モデルからキャプション予測を抽出したいと思います:
def sample(self, features, states=None):
"""Samples captions for given image features (Greedy search)."""
sampled_ids = []
inputs = features.unsqueeze(1)
for i in range(20): # maximum sampling length
hiddens, states = self.lstm(inputs, states) # (batch_size, 1, hidden_size),
outputs = self.linear(hiddens.squeeze(1)) # (batch_size, vocab_size)
predicted = outputs.max(1)[1]
sampled_ids.append(predicted)
inputs = self.embed(predicted)
inputs = inputs.unsqueeze(1) # (batch_size, 1, embed_size)
sampled_ids = torch.cat(sampled_ids, 1) # (batch_size, 20)
return sampled_ids.squeeze()
の問題は、私は理解できないですLSTMの外に隠れ状態を取得し、次の時間ステップに戻ってそれをポンピングするためCNTK相当アウト:
hiddens, states = self.lstm(inputs, states)
どのようにしてCNTKで、この作品?