#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. Кроме того, у меня есть набор тестов и соответствующие, истинные, метки для этого, но с тех пор я не вставлял их в код. Сейчас я только пытаюсь обучить модель. Я не знаю, поможет ли что-нибудь из этого, но я подумал, что должен упомянуть об этом. Еще раз спасибо за всю вашу помощь до сих пор.