2016-10-07 12 views
-1

私は配列x_traintargets_trainを持っています。トレーニングデータをシャッフルしてより小さなバッチに分割し、バッチをトレーニングデータとして使用したいと思います。言って、私はエラーを取得する私は、トレーニングデータをシャッフルするときIndexError:サイズが0の軸のインデックスが範囲外です

x_train = np.memmap('/home/usr/train', dtype='float32', mode='r', shape=(1000, 1, 784)) 
# print(x_train) 
targets_train = np.memmap('/home/usr/train_label', dtype='int32', mode='r', shape=(1000, 1)) 
train_idxs = [i for i in range(x_train.shape[0])] 
np.random.shuffle(train_idxs) 


num_batches_train = 4 
def next_batch(start, train, labels, batch_size=250): 
    newstart = start + batch_size 
    if newstart > train.shape[0]: 
     newstart = 0 
    idxs = train_idxs[start:start + batch_size] 
    # print(idxs) 
    return train[idxs, :], labels[idxs, :], newstart 


# x_train_lab = x_train[:200] 
# # x_train = np.array(targets_train) 
# targets_train_lab = targets_train[:200] 
for i in range(num_batches_train): 
    x_train, targets_train, newstart = next_batch(i*batch_size, x_train, targets_train, batch_size=250) 

問題は、あるバッチにアクセスしよう:

return train[idxs, :], labels[idxs, :], newstart 
    IndexError: index 250 is out of bounds for axis 0 with size 250 
を私の元のデータが1000行を持っていると私はそれらの250行を使用しようとするたびに

私は何が間違っているのか知っている人はいますか?

+2

サイズが250の場合、最後のインデックスはおそらく249です。0から開始します。 –

+0

シャッフルしないと最初のバッチインデックスは0から249まで、次のインデックスは250から499までとなります..もし私がインデックスをシャッフルすれば、最初のバッチはインデックス番号619を持つかもしれません!私はエラー "IndexError:インデックス652は、サイズが250の軸0の範囲外です " ...私は問題を意味していますそれは行を受け入れ、インデックスをリセットすることを理解していない! – ga97rasl

+0

関数に渡す変数 'x_train'と' targets_train'に内容がありますか?私は印刷し、確かに1000シャッフルされた行があることを確認します。 – kmario23

答えて

0

問題は、関数定義では、この行である:

idxs = train_idxs[start:start + batch_size] 

に変更し、それを:

idxs = train_idxs[start: newstart] 

予想通りその後、それが動作するはずです!

また、のようなものにforループ内の変数名を変更してください:

batch_size = 250 
for i in range(num_batches_train): 
    x_train_split, targets_train_split, newstart = next_batch(i*batch_size, 
                   x_train, 
                   targets_train, 
                   batch_size=250) 
    print(x_train_split.shape, targets_train_split.shape, newstart) 

出力例:

(250, 1, 784) (250, 1) 250 
(250, 1, 784) (250, 1) 500 
(250, 1, 784) (250, 1) 750 
(250, 1, 784) (250, 1) 1000 
+0

エラーはその行にありません。後で 'idxs'がインデックスとして使われます。 – hpaulj

+0

@hpauljだから、私が間違っている出力はありましたか? – kmario23

+0

計算に問題があるとは思わない。 OPの問題は、彼が反復して 'x_train'をどのように変更するかである。 – hpaulj

1

(編集 - 最初についてnewstart削除を推測)

でこの行:

x_train, targets_train, newstart = next_batch(i*batch_size, x_train, targets_train, batch_size=250) 

各繰り返しでx_trainのサイズを変更しますが、フルサイズのアレイ用に作成したtrain_idxsアレイを引き続き使用します。

x_trainからランダムな値を一括して取り出すことが1つありますが、選択配列の一貫性を維持する必要があります。

この質問は、最小限の検証可能な例がないために閉じられているはずです。問題の再現を念頭に置いて、小さなテスト可能な例を推測して作成しなければならないのは、欲求不満です。

https://stackoverflow.com/help/mcve

私の現在の推測が間違っている場合は、わずか数の中間print文は、問題が明らかになっただろう。

========================

import numpy as np 
x_train = np.arange(20).reshape(20,1) 
train_idxs = np.arange(x_train.shape[0]) 
np.random.shuffle(train_idxs) 

num_batches_train = 4 
batch_size=5 
def next_batch(start, train): 
    idxs = train_idxs[start:start + batch_size] 
    print(train.shape, idxs) 
    return train[idxs, :] 

for i in range(num_batches_train): 
    x_train = next_batch(i*batch_size, x_train) 
    print(x_train) 

実行が生産する単純なケースにあなたのコードの削減:

1658:~/mypy$ python3 stack39919181.py 
(20, 1) [ 7 18 3 0 9] 
[[ 7] 
[18] 
[ 3] 
[ 0] 
[ 9]] 
(5, 1) [13 5 2 15 1] 
Traceback (most recent call last): 
    File "stack39919181.py", line 14, in <module> 
    x_train = next_batch(i*batch_size, x_train) 
    File "stack39919181.py", line 11, in next_batch 
    return train[idxs, :] 
IndexError: index 13 is out of bounds for axis 0 with size 5 

Iはバックnext_batchに(5,1)x_trainを与え、それが元あったかのようにインデックスにそれを試してみました。反復を変更

for i in range(num_batches_train): 
    x_batch = next_batch(i*batch_size, x_train) 
    print(x_batch) 

は、5行の4つのバッチを生成を介して実行することができます。

+0

興味深いことに、独自の質問番号のあとにプログラムスタックの名前を付けることの背後にある論理は何ですか? – kmario23

+1

私はこれがスクリプト名を一意に保つ最も簡単な方法であると十分な質問に答えました。私は数日後にスクリプトを改訂する理由はほとんどありませんが。 – hpaulj

関連する問題