IndexError: список индексов вне диапазона в TensorFlow
Я получил ошибку,IndexError: список индексов выходит за пределы диапазона.
Run id: P0W5X0
Log directory: /tmp/tflearn_logs/
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/xxx/anaconda/xxx/lib/python2.7/site-packages/tflearn/data_flow.py", line 201, in fill_batch_ids_queue
ids = self.next_batch_ids()
File "/Users/xxx/anaconda/xxx/lib/python2.7/site-packages/tflearn/data_flow.py", line 215, in next_batch_ids
batch_start, batch_end = self.batches[self.batch_index]
IndexError: list index out of range
Я написал коды,
# coding: utf-8
import tensorflow as tf
import tflearn
from tflearn.layers.core import input_data,dropout,fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression
tf.reset_default_graph()
net = input_data(shape=[None,20000, 4, 42])
net = conv_2d(net, 4, 16, activation='relu')
net = max_pool_2d(net, 1)
net = tflearn.activations.relu(net)
net = dropout(net, 0.5)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.5, loss='categorical_crossentropy')
model = tflearn.DNN(net)
model.fit(np.array(trainDataSet).reshape(1,20000, 4, 42), np.array(trainLabel), n_epoch=400, batch_size=32, validation_set=0.1, show_metric=True)
pred = np.array(model.predict(np.array(testDataSet).reshape(1,20000, 4, 42)).argmax(axis=1))
label = np.array(testLabel).argmax(axis=0)
accuracy = np.mean(pred == label, axis=0)
print(accuracy)
Я действительно не могу понять, почему такая ошибка происходит. Я пытался переписать в
model.fit(np.array(trainDataSet).reshape(1,20000, 4, 42), np.array(trainLabel), n_epoch=400, batch_size=1, validation_set=0.1, show_metric=True)
потому что bach вызывает эту ошибку, но происходит такая же ошибка. Я переписываю другое число в этой части, но происходит такая же ошибка. Что не так в моих кодах? Как это исправить?
1 ответ
Вопрос
Как я могу исправить мой индекс списка из-за ошибки диапазона?
Ответ
Из вашего кода видно, что в вашем обучающем и тестовом наборе, который вы передаете в нейронную сеть, есть только 1 элемент, заданный функцией reshape(1,20000, 4, 42) формы 20000x4x42. Я полагаю, что вы имели в виду 20000 элементов 4х42.
Вместо reshape(1,20000, 4, 42)
давайте использовать reshape(20000, 4, 42, 1)
, Мы также должны будем изменить input_data(shape=[None, 20000, 4, 42])
в input_data(shape=[None, 4, 42, 1])
Если вы сделаете это, ваш код работает нормально.
Рабочий код
# coding: utf-8
import tensorflow as tf
import tflearn
from tflearn.layers.core import input_data,dropout,fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.normalization import local_response_normalization
from tflearn.layers.estimator import regression
tf.reset_default_graph()
net = input_data(shape=[None, 4, 42, 1])
net = conv_2d(net, 4, 16, activation='relu')
net = max_pool_2d(net, 1)
net = tflearn.activations.relu(net)
net = dropout(net, 0.5)
net = tflearn.fully_connected(net, 2, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.5, loss='categorical_crossentropy')
model = tflearn.DNN(net)
model.fit(np.array(trainDataSet).reshape(20000, 4, 42, 1), np.array(trainLabel), n_epoch=400, batch_size=32, validation_set=0.1, show_metric=True)
pred = np.array(model.predict(np.array(testDataSet).reshape(20000, 4, 42, 1)).argmax(axis=1))
label = np.array(testLabel).argmax(axis=0)
accuracy = np.mean(pred == label, axis=0)
print(accuracy)
Выход
Чтобы приведенный выше код работал, мы должны включить некоторые данные обучения и тестирования. Numpy random используется так
import numpy as np
trainDataSet = np.random.rand(20000, 4, 42)
trainLabel = ( np.random.rand(20000,2) > .5 ) *1.0
testDataSet = np.random.rand(20000, 4, 42)
testLabel = ( np.random.rand(20000,2) > .5 ) *1.0
Вот вывод
Run id: JDSG88
Log directory: /tmp/tflearn_logs/
---------------------------------
Training samples: 18000
Validation samples: 2000
--
Training Step: 563 | total loss: 12.13387 | time: 5.312s
| Adam | epoch: 001 | loss: 12.13387 - acc: 0.7138 | val_loss: 11.90437 - val_acc: 0.7400 -- iter: 18000/18000
--
Training Step: 1126 | total loss: 11.58909 | time: 5.184s
| Adam | epoch: 002 | loss: 11.58909 - acc: 0.7496 | val_loss: 11.90437 - val_acc: 0.7400 -- iter: 18000/18000
--
Training Step: 1689 | total loss: 11.93482 | time: 5.174s
| Adam | epoch: 003 | loss: 11.93482 - acc: 0.7357 | val_loss: 11.90437 - val_acc: 0.7400 -- iter: 18000/18000
--
...
У меня тоже была такая же проблема с тобой. Мое решение - сделать число n_epoch равным номеру вашей строки в наборе данных. Например, форма моего массива 461*5, значение n_epoch равно 461. Вы также можете сделать значение немного больше или короче, чем номер вашей строки. В моем коде 500 или 400 также полезно.