2016-10-07 7 views
-1

Ich habe Array x_train und targets_train. Ich möchte die Trainingsdaten mischen und in kleinere Batches aufteilen und die Batches als Trainingsdaten verwenden. Meine ursprünglichen Daten hat 1000 Zeilen und jedes Mal, wenn ich versuchen, 250 Zeilen von ihnen zu verwenden:IndexError: Index ist außerhalb der Grenzen für Achse 0 mit der Größe

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) 

Das Problem ist, wenn ich die Trainingsdaten mischen und versuchen, den Zugang zu Chargen ich Fehler sagen:

return train[idxs, :], labels[idxs, :], newstart 
    IndexError: index 250 is out of bounds for axis 0 with size 250 

Gibt es jemanden, der weiß, was mache ich falsch?

+2

Wenn die Größe 250 ist, ist der letzte Index wahrscheinlich 249, wie es von 0 beginnt 0 –

+0

Ja, wenn ich nicht shuffle die ersten Batch-Indizes von 0 bis 249 aber die nächste wäre 250 bis 499 und so weiter .. Wenn ich die Indizes mische, könnte der erste Stapel die Indexnummer 619 haben! was ich bekomme Fehler "IndexError: Index 652 ist außerhalb der Grenzen für Achse 0 mit der Größe 250 " ... Ich meine das Problem ist Es versteht nicht, die Zeilen zu akzeptieren und die Indizes zurückgesetzt! – ga97rasl

+0

Gibt es in den Variablen 'x_train' und' targets_train' Inhalte, die Sie an die Funktion übergeben? Ich würde drucken und sicherstellen, dass es tatsächlich 1000 gemischte Reihen gibt. – kmario23

Antwort

0

Das Problem ist in dieser Zeile in der Funktionsdefinition:

idxs = train_idxs[start:start + batch_size] 

Ändern Sie es an:

idxs = train_idxs[start: newstart] 

sollte es dann wie erwartet!

Sie bitte auch die Variablennamen in der for Schleife um so etwas wie ändern:

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) 

Beispielausgabe:

(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

Der Fehler ist nicht in dieser Zeile. Es ist später, wenn "idxs" als ein Index verwendet wird. – hpaulj

+0

@hpaulj Also, war die Ausgabe, die ich falsch verstanden? – kmario23

+0

Ich glaube nicht, dass es ein Problem mit Ihren Berechnungen gibt. Das Problem von OP besteht darin, wie er 'x_train' iteriert und ändert. – hpaulj

1

(edit - erste newstart Vermutung über gelöscht)

In Diese Zeile:

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

Sie ändern die Größe von x_train mit jeder Iteration. Sie verwenden jedoch weiterhin das Array train_idxs, das Sie für das Array voller Größe erstellt haben.

Es ist eine Sache, zufällige Werte aus x_train in Batches zu ziehen, aber Sie müssen die Auswahl-Arrays konsistent halten.

Diese Frage sollte wahrscheinlich aus Mangel an einem minimalen und überprüfbaren Beispiel geschlossen worden sein. Es ist frustrierend, raten zu müssen und ein kleines testbares Beispiel zu geben, in der Hoffnung, das Problem neu zu erstellen.

https://stackoverflow.com/help/mcve

Wenn meine aktuelle Vermutung falsch ist, nur ein paar Zwischen print-Anweisungen das Problem deutlich gemacht hätten.

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

Reduzierung der Code auf einen einfachen Fall

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) 

ein Lauf erzeugt:

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 

ich fütterte die (5,1) x_train zurück die next_batch aber versucht, es zu indizieren, als ob es das Original war.

Ändern der Iteration:

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

lässt es durch die Herstellung von 4 Chargen von 5 Reihen laufen.

+0

interessant, was ist die Logik hinter der Benennung Ihrer Programmstapel gefolgt von der eindeutigen Frage Nummer? – kmario23

+1

Ich habe genug Fragen beantwortet, dass dies der einfachste Weg ist, die Skriptnamen einzigartig zu halten. Allerdings habe ich selten Grund, die Skripte nach ein paar Tagen zu revidieren. – hpaulj

Verwandte Themen