Ошибка выхода индекса списка за пределы диапазона с помощью TensorFlow

#python #tensorflow #keras #deep-learning #image-classification

Вопрос:

Я использую TensorFlow для создания модели классификации изображений. Я написал следующие строки кода:

 import pandas as pd
import os
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Conv2D , MaxPool2D , Flatten , Dropout 
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from  matplotlib import pyplot as plt
import matplotlib.image as mpimg
import random 
%matplotlib inline 
import matplotlib.pyplot as plt
from tensorflow.keras import datasets, layers, models
import glob
from PIL import Image

 

—импорт всех моих библиотек

 #newer code
dic = {}
# assuming you have .png format files else change the same into the glob statement
train_images='/Users/FOLDER/downloads/Boneage_competition/training_dataset/Resized/'

for file in glob.glob(train_images '/*.png'):
    b_name = os.path.basename(file).split('.')[0]
    dic[b_name] = mpimg.imread(file)

dic_label_match = {}
label_file = '/Users/FOLDER/downloads/train.csv'
train_labels = pd.read_csv (r'/Users/FOLDER/downloads/train.csv')
for i in range(len(train_labels)):
    # given your first column is age and image no starts from 1
    dic_label_match[i 1] =  str(train_labels.iloc[i][0])
    # you can use the below line too
    # dic_label_match[i 1] =  str(train_labels.iloc[i][age])

# now you have dict with keys and values 
# create two lists / arrays and you can pass the same to the keram model

train_x = []
label_ = []

for val in dic:
    if val in dic and val in dic_label_match:
        train_x.append(dic[val])
        label_.append(dic_label_match[val])
 

— добавление каждого изображения к соответствующей метке

 model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(12611,300,300,1)),
    tf.keras.layers.Dense(2, activation='relu'),
    tf.keras.layers.Dense(2)
])
 

—Применение модели к набору данных

 loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

 
 model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])
 

— compiling my model

 model.fit(train_x, label_, epochs=5)

 

После запуска этого кода меня встречает сообщение об ошибке в последней строке. Все сообщение таково:

 IndexError                                Traceback (most recent call last)
<ipython-input-24-ca24364bad96> in <module>
----> 1 model.fit(train_x, label_, epochs=5)

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    706     self._check_call_args('fit')
    707 
--> 708     func = self._select_training_loop(x)
    709     return func.fit(
    710         self,

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py in _select_training_loop(self, inputs)
    498             self._distribution_strategy)):
    499       try:
--> 500         valid_adapter = data_adapter.select_data_adapter(inputs, None)
    501       except ValueError as data_failure_exception:
    502         valid_adapter = None

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/data_adapter.py in select_data_adapter(x, y)
    645 def select_data_adapter(x, y):
    646   """Selects a data adapter than can handle a given x and y."""
--> 647   adapter_cls = [cls for cls in ALL_ADAPTER_CLS if cls.can_handle(x, y)]
    648   if not adapter_cls:
    649     # TODO(scottzhu): This should be a less implementation-specific error.

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/data_adapter.py in <listcomp>(.0)
    645 def select_data_adapter(x, y):
    646   """Selects a data adapter than can handle a given x and y."""
--> 647   adapter_cls = [cls for cls in ALL_ADAPTER_CLS if cls.can_handle(x, y)]
    648   if not adapter_cls:
    649     # TODO(scottzhu): This should be a less implementation-specific error.

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/data_adapter.py in can_handle(x, y)
    451   @staticmethod
    452   def can_handle(x, y=None):
--> 453     handles_x = ListsOfScalarsDataAdapter._is_list_of_scalars(x)
    454     handles_y = True
    455     if y is not None:

~/opt/anaconda3/envs/ML2/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/data_adapter.py in _is_list_of_scalars(inp)
    462       return True
    463     if isinstance(inp, (list, tuple)):
--> 464       return ListsOfScalarsDataAdapter._is_list_of_scalars(inp[0])
    465     return False
    466 

IndexError: list index out of range

 

Я пытался настроить номер эпохи, а также использовать другие модели безрезультатно.

Если у вас есть какие-либо идеи, почему это может быть, или какие-либо советы по моему коду, мы будем вам очень признательны!

Ответ №1:

Вы получаете ошибку из-за следующей строки

 dic_label_match[i 1] =  str(train_labels.iloc[i][0])
 

Здесь вы индексируете с 1 вместо 0. Поэтому, когда вы выполняете следующую строку

 label_.append(dic_label_match[val])
 

Ваша label_ ценность начинается с 1, 2, .... того, с чего она должна начинаться 0, 1, ... .

Следовательно, вы можете либо изменить строку следующим образом

 label_.append(dic_label_match[val - 1])
 

или вы можете изменить следующую строку

 dic_label_match[i] =  str(train_labels.iloc[i][0])
 

Комментарии:

1. Я обновил код, но могу ли я спросить, что это значит? Я все еще получаю ошибку в следующем блоке кода. — в качестве примечания я забыл указать свою потерю f(x) в своем коде, поэтому я обновил свой код в своем вопросе.

2. @John, поскольку вы не указали детали функции потери, вот почему я подумал, что это может быть причиной того, что вы получаете ошибку. Но поскольку теперь вы обновили код, я соответствующим образом обновил свой ответ—

3. Спасибо, я исправил это, но, к сожалению, я все еще получаю сообщение об ошибке. Если у вас есть какие-либо идеи, я был бы вам очень признателен, но если нет, то это совершенно нормально.

4. Также (я приношу свои извинения за повторные комментарии) , но для справки, как метки изображений, так и файл CSV начинают свою нумерацию с изображения №1377. Кроме того, у меня есть набор тестов и соответствующие, истинные, метки для этого, но с тех пор я не вставлял их в код. Сейчас я только пытаюсь обучить модель. Я не знаю, поможет ли что-нибудь из этого, но я подумал, что должен упомянуть об этом. Еще раз спасибо за всю вашу помощь до сих пор.