2017-07-11 6 views
0

私はUdacityのLSTMチュートリアルに従っていますが、LSTMの入力データフォーマットを理解するのは苦労しています。 https://github.com/rndbrtrnd/udacity-deep-learning/blob/master/6_lstm.ipynbTensorflow LSTMの入力フォーマットの例batches2string

以下のコードでnum_unrollingについて説明できますか?またはLSTMモデルのトレーニングバッチを生成する方法は?

batch_size=64 
num_unrollings=10 

class BatchGenerator(object): 
    def __init__(self, text, batch_size, num_unrollings): 
    self._text = text 
    self._text_size = len(text) 
    self._batch_size = batch_size 
    self._num_unrollings = num_unrollings 
    segment = self._text_size // batch_size 
    self._cursor = [ offset * segment for offset in range(batch_size)] 
    self._last_batch = self._next_batch() 

    def _next_batch(self): 
    """Generate a single batch from the current cursor position in the data.""" 
    batch = np.zeros(shape=(self._batch_size, vocabulary_size), dtype=np.float) 
    for b in range(self._batch_size): 
     batch[b, char2id(self._text[self._cursor[b]])] = 1.0 
     self._cursor[b] = (self._cursor[b] + 1) % self._text_size 
    return batch 

    def next(self): 
    """Generate the next array of batches from the data. The array consists of 
    the last batch of the previous array, followed by num_unrollings new ones. 
    """ 
    batches = [self._last_batch] 
    for step in range(self._num_unrollings): 
     batches.append(self._next_batch()) 
    self._last_batch = batches[-1] 
    return batches 

def characters(probabilities): 
    """Turn a 1-hot encoding or a probability distribution over the possible 
    characters back into its (most likely) character representation.""" 
    return [id2char(c) for c in np.argmax(probabilities, 1)] 

def batches2string(batches): 
    """Convert a sequence of batches back into their (most likely) string 
    representation.""" 
    s = [''] * batches[0].shape[0] 
    for b in batches: 
    s = [''.join(x) for x in zip(s, characters(b))] 
    return s 

train_batches = BatchGenerator(train_text, batch_size, num_unrollings) 
valid_batches = BatchGenerator(valid_text, 1, 1) 

print(batches2string(train_batches.next())) 
print(batches2string(train_batches.next())) 

カーソルがあります。しかし、なぜ64個のバッチの最初の10文字(num_unrolling)以外のテキストを捨てるのでしょうか?

入力形式の理解に役立つリソースや例を教えてください。ありがとう!

答えて

3

トレーニング中のRNNの目的は、文字列内の次の文字を予測し、各文字の位置に1つのLSTMがあることを覚えておいてください。 引用されたコードの上のコードでは、文字から数字へのマッピングも '0'、 'a'は1、 'b'は2などです。さらにこれは '1-hot'エンコーディングすなわち「0」である「0」は[1 0 0 0 ... 0]、[0 1 0 0 ... 0]として1である「a」、[0 0 1 0 0として「b」として符号化される。 .. 0]。以下の説明では、わかりやすくするためにこのマッピングをスキップしています。したがって、すべての文字は実際に数字であるか、実際には1つのホットエンコーディングでなければなりません。

もっと簡単なケースから始めましょう。ここでは、 batch_size = 1とnum_unrollings = 1です。 私たちはまた、あなたのトレーニングデータが この場合

あなたの最初の文字が「」アナキストと予想される出力(ラベル)であるである「アナキストが自律的個人ムトゥの任意団体に基づいて社会的関係を提唱」であるとしましょう'n'。 コードでは、これはnext()の戻り値で表されます。 batches = [['a']、['n']]ここで、リストの最初の要素は入力であり、最後の要素はラベルです。 これはステップ0でRNNに入力されます。 次のステップで入力は 'n'で、ラベルは 'anarchi ...'の3番目の文字なので、次の バッチ= [['n']、['a']] 3番目のステップのバッチは バッチ= [['a']、['r']] などです。内部リストの最後の要素(self._last_batch)が内側リストの最初の要素次の時間ステップ(バッチの= [self._last_batch])。

である場合num_unrollings = 1 場合num_unrollings = 5、代わりにのみ前進1 LSTM部あなたはnum_unrolling = 5つのLSTM単位をステップ毎にステッピングしたがって、次の関数は5文字の 'a'、 'n'、 'a'、 'r'、 'c'および対応するラベルである5番目のRNNの入力を提供する必要があります'n'、 'a'、 'r'、 'c'、 'h' 最後の4つの入力文字が最初の4つのラベルと同じであることに注意してください。より効率的に使用するには、最初の6文字のリストとしてコード化されています。

バッチ= [['a']、['n

最初の5文字が入力であり、最後の5文字が文字列であることを理解している限り、[]ラベル。次回の次回の呼び出し時には、次の5つ目の入力とラベルを返します

バッチ= [['i']、['s']、['t']、 '']]]、 'h'は以前はラベルとして使用されていたもので、現在は入力としてのみ使用されていることに注意してください。

batch_size> 1の場合、いくつかのシーケンスをRNN更新ステップに同時に送ります。カーソルはカーソルではなく、カーソルのリストです(各シーケンスごとに1つ)。今すぐ検討するbatch_size = 2 訓練データが100文字である上記の例では、「アナキストは自主的な個人の団体に基づく社会関係を主張する」という文脈の第2のシーケンスは、真ん中で始まる。 「自律的個人mutu "したがって、 最初のステップのバッチには、['a'、 'n'、 'a'、 'r'、 'c'、 'h']および['l'、 'u'、 'n '、' t '、' a '、' r ']で、前と同じ6番目の文字と中間の後の最初の6個の文字に対応します。 ただし、以下のように編成されていますバッチ= [['a'、 'l']、['n'、 'u']、['a'、 'n']、['r'、 ' 2番目のタイムステップのバッチは に['h'、 'i'、s '、' 't'、 's'、 '']、['r'、 'y'、 ''、 'a'、 's' r ']、[' i '、' y ']、[' s '、' ']、[' t '、' a ']、[' s '、' ''、 's'] ] など。

上記は、バッチの生成にnum_unrollingsが何を意味するかに関する技術的な答えです。ただし、num_unrollingsは、RNNのウェイトの更新のバックプロパゲーション部分で戻ってくる文字数です。 これは、RNN学習アルゴリズムの各時間ステップでnum_unrolling入力文字を入力し、対応するlstmでのみ計算しますが、シーケンスの前の部分からの(隠れた)入力は、訓練可能なnum_urollingsを1に設定して、長距離相関を知ることが難しいかどうかを調べることができます。 (多くのタイムステップが必要な場合があります)。

+0

徹底的な回答をお寄せいただきありがとうございます。私はこれに私の脳を掛けていた。 'batches2string(train_batches.next())'は、期待される順番(リスト、 'vocabulary_size' one-hotsの' num_unrollings + 1'文字の 'batch_order'長さ)を示します。 しかし、 'train_batches.next()'はちょうど畳み込まれているようです。これは 'num_unrollings + 1'のリストで、各メンバーは文字の' vocabulary_size'ワンホットリストの 'batch_size'リストを含む配列です。 – GAEfan

+0

この詳細な回答をありがとうございました。それは素晴らしい。最後の5文字 - >最後の1文字 – Aaron

関連する問題