その他の2つの回答は正確ですが、詳細は低いです。私はちょうどこれを自分で行う方法を見ていた。
Tensorには機械があり、このすべてに機械があります(一部の部分では過度なことがあります)。
文字列テンソルからスタート(形状[3]):(。疑問符の前にスペースを注意してください)
import tensorflow as tf
lines = tf.constant([
'Hello',
'my name is also Mark',
'Are there any other Marks here ?'])
vocabulary = ['Hello', 'my', 'name', 'is', 'also', 'Mark', 'Are', 'there', 'any', 'other', 'Marks', 'here', '?']
単語にこれを分割されて最初に行うべきこと
words = tf.string_split(lines," ")
言葉は疎テンソル(形[3,7])になります。インデックスの2つの次元が[行番号、位置]である場合。今、あなたは単語の検索を行うことができます
indices values
0 0 'hello'
1 0 'my'
1 1 'name'
1 2 'is'
...
::これは、次のように表現され
table = tf.contrib.lookup.index_table_from_tensor(vocabulary)
word_indices = table.lookup(words)
これは彼らの語彙指標に置き換え言葉でスパーステンソルを返します。そうしてみましょう...あなたはそれがLSTMに置くことはおそらくだ可変長シーケンスを処理しているのであれば
line_number = word_indices.indices[:,0]
line_position = word_indices.indices[:,1]
lengths = tf.segment_max(data = line_position,
segment_ids = line_number)+1
:
今、あなたは、各ライン上の最大値の位置を見て、シーケンスの長さを読み出すことができますワード埋め込み(それが密入力を必要とする)入力のために使用します。今の形状を有することになる埋め込み
EMBEDDING_DIM = 100
dense_word_indices = tf.sparse_tensor_to_dense(word_indices)
e_layer = tf.contrib.keras.layers.Embedding(len(vocabulary), EMBEDDING_DIM)
embedded = e_layer(dense_word_indices)
を[3,7,100]、[行、単語、embedding_dim]。
次に簡単なLSTMを構築することができます。
LSTM_SIZE = 50
lstm = tf.nn.rnn_cell.BasicLSTMCell(LSTM_SIZE)
とパディングを扱う、シーケンス全体を実行します。
outputs, final_state = tf.nn.dynamic_rnn(
cell=lstm,
inputs=embedded,
sequence_length=lengths,
dtype=tf.float32)
出力は[3,7,50]、または[line、word、lstm_size]という形になりました。
from tensorflow.contrib.learn.python.learn.estimators.rnn_common import select_last_activations
final_output = select_last_activations(outputs,tf.cast(lengths,tf.int32))
すべてのインデックスは、最後のタイムステップからの出力を選択するようにシャッフルん:あなたは、各ラインの最後のワードで状態をつかむしたい場合は、(!!隠された文書化されていない)select_last_activations
機能を使用することができます。これは私がまだ詳細を働いていない[3,50]の大きさまたは[行、lstm_size]
init_t = tf.tables_initializer()
init = tf.global_variables_initializer()
with tf.Session() as sess:
init_t.run()
init.run()
print(final_output.eval().shape())
を与えるが、私は、これはおそらく、すべてを単一のtf.contrib.learn.DynamicRnnEstimatorに置き換えることができると思います。
テキストは、しばしばシーケンスモデルによって処理されます。 IEでは、あなたのモデルは前のステップの現在の単語と出力を受け入れ、モデルのコピーを積み重ねます。ベースラインとして、「単語の袋」から始めることができます。すべての単語を1つの辞書ベクトルにまとめて追加するだけです。 –
お返事ありがとうございます。私の質問は、Tensorflowのデータ構造がモデルよりも重要です。私はbag-of-wordsで表現されたテキストを与えられたRNNを使うことができます。それでもデータポイントの長さが異なる場合、このデータをどこに保存するのですか? – Marco
単語の埋め込みに関する削除の参照を編集し、私の質問を明確にするための具体的な例を示しました。 – Marco