ラップアラウンドを使用して、1ステップ右にシフトした配列を返すロジックを作成しようとしています。ラップアラウンドを実装するためにIndexErrorを受け取ることに依存していましたが、エラーはスローされません!
def get_batches(arr, batch_size, seq_length):
"""
Return arr data as batches of shape (batch_size, seq_length)
"""
n_chars = batch_size * seq_length
n_batches = int(np.floor(len(arr)/ n_chars))
n_keep = n_chars * n_batches
arr = arr[:n_keep].reshape(batch_size, -1)
for b in range(n_batches):
start = b * seq_length
stop = start + seq_length
x = arr[:, start:stop]
try:
y = arr[:, start + 1: stop + 1]
except IndexError:
y = np.concatenate(x[:, 1:], arr[:, 0], axis=1)
yield x, y
したがって、このコードy
は、最後の配列が生成される場合を除いて、うまく機能します...(2,2)
期待される代わりに配列を取得し(2,3)
ます。これは、IndexErrorがスローされないためです。
test = np.arange(12)
batches = get_batches(test, 2, 3)
for x, y in batches:
print('x=', x)
print('y=', y, '\n')
収量
x=
[[0 1 2]
[6 7 8]]
y= # as expected
[[1 2 3]
[7 8 9]]
x=
[[ 3 4 5]
[ 9 10 11]]
y= # truncated :(
[[ 4 5]
[10 11]]
誰かがこれを行う方法について別の提案がありますか?できれば、失敗したソリューションと同じくらい単純なものですか?
これを試して:
from skimage.util.shape import view_as_windows
def get_batches2(arr, batch_size, seq_length):
"""
Return arr data as batches of shape (batch_size, seq_length)
"""
n_chars = batch_size * seq_length
n_batches = int(np.floor(len(arr)/ n_chars))
n_keep = n_chars * n_batches
arr = arr[:n_keep].reshape(batch_size, -1)
x = view_as_windows(arr, (batch_size, seq_length), seq_length)[0]
y = view_as_windows(np.roll(arr,-1,axis=1), (batch_size, seq_length), seq_length)[0]
return x, y
view_as_windows
同じ共有メモリを使用します(これはビューです。同じメモリを共有しているかどうかを確認できます)。したがって、ループを使用して生成するか、返すかは問題ではありません。それが問題である場合(特にウィンドウが重なっていない場合)、余分なメモリを使用することはなく、ジェネレータよりもはるかに高速である必要があります。おそらく、これを簡単に再形成することで実現することもできview_as_windows
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加