Вопрос или проблема
Я постоянно работал над тем, чтобы научиться использовать классификацию изображений для своей программы на Python, и я использовал существующую реализацию из интернета, которая использует cifar10:
local_dataset_path="cifar-10-python.tar.gz"
extracted_path="cifar-10-batches-py"
# Извлечение .tar.gz файла
with tarfile.open(local_dataset_path, 'r:gz') as file:
file.extractall() # Извлекает в текущий каталог
# Функция для загрузки данных из файла партии
def load_batch(batch_path):
with open(batch_path, 'rb') as file:
batch = pickle.load(file, encoding='latin1')
images = batch['data']
labels = batch['labels']
# Изменяем форму и нормализуем изображения
images = images.reshape((len(images), 3, 32, 32)).transpose(0, 2, 3, 1) / 255.0
labels = np.array(labels)
return images, labels
# Загрузка всех партий для обучения
training_images = []
training_labels = []
for i in range(1, 6):
batch_path = os.path.join(extracted_path, f'data_batch_{i}')
images, labels = load_batch(batch_path)
training_images.append(images)
training_labels.append(labels)
# Объединяем все изображения и метки для обучения
training_images = np.concatenate(training_images)
training_labels = np.concatenate(training_labels)
# Загрузка тестовой партии
test_batch_path = os.path.join(extracted_path, 'test_batch')
testing_images, testing_labels = load_batch(test_batch_path)
# Названия классов для набора данных CIFAR-10
class_names = ['Самолет', 'Автомобиль', 'Птица', 'Кошка', 'Оленя', 'Собака', 'Лягушка', 'Лошадь', 'Корабль', 'Грузовик']
# Отображение первых 16 изображений
import matplotlib.pyplot as plt
for image in range(16):
plt.subplot(4, 4, image + 1)
plt.xticks([])
plt.yticks([])
plt.imshow(training_images[image])
plt.xlabel(class_names[training_labels[image]])
# plt.show()
training_images = training_images[:2000]
training_labels = training_labels[:2000]
testing_images = testing_images[:4000]
testing_labels = testing_labels[:4000]
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics = ['accuracy'])
model.fit(training_images, training_labels, epochs=10, validation_data=(testing_images, testing_labels))
loss, accuracy = model.evaluate(testing_images, testing_labels)
print(f"Потери: {loss}")
print(f"Точность: {accuracy}")
model.save('image_classifier.model')
Я не уверен, правильно ли я извлекаю и загружаю gz файл, так что, если у кого-то есть комментарии по этому поводу, дайте знать. На данный момент основная проблема, с которой я столкнулся, заключалась в следующем: ValueError: Неверное расширение пути файла для сохранения. Пожалуйста, добавьте либо .keras
расширение для формата Keras (рекомендуется), либо .h5
расширение. Используйте model.export(filepath)
, если хотите экспортировать SavedModel для использования с TFLite/TFServing и т. д. Получено: filepath=image_classifier.model.
Согласно инструкционному видео, которым я следую, код, который я тестировал, работал нормально с image_classifier.model ранее, но по какой-то причине теперь требуется использовать keras или h5? Это связано с версией tensorflow? Какой из них мне следует использовать? Для справки, у меня установлена версия tensorflow 2.17, версия keras 3.5, и мой редактор – VS Code. Моя версия python 3.11.8.
Ответ или решение
Судя по предоставленной информации, вы столкнулись с ошибкой ValueError: "Invalid filepath extension for saving" при попытке сохранить вашу модель CNN с помощью метода model.save()
. Эта ошибка возникает из-за того, что вы не указали правильное расширение файла для сохранения модели. В последних версиях TensorFlow и Keras, для сохранения моделей рекомендуется использовать расширение .keras
или .h5
.
Решение проблемы:
-
Изменение расширения файла:
Чтобы исправить ошибку, вам следует изменить имя файла при вызове функцииmodel.save()
и использовать одно из следующих расширений:- Для сохранения в формате Keras (рекомендуемый способ):
model.save('image_classifier.keras')
- Для сохранения в формате HDF5:
model.save('image_classifier.h5')
- Для сохранения в формате Keras (рекомендуемый способ):
-
Версии библиотек:
Обратите внимание, что ваша версия TensorFlow (2.17) и Keras (3.5) поддерживают эти форматы. Поэтому использование этих расширений должно устранить вашу ошибку. -
Дополнительные советы:
Если вы планируете использовать модель в других приложениях или для развертывания (например, TensorFlow Serving или TFLite), используйте методmodel.export(filepath)
:model.export('image_classifier')
Это создаст структуру каталогов, которая содержит все необходимые файлы для использования модели в различных средах.
Итог:
Используйте правильное расширение для сохранения вашей модели, чтобы избежать ошибки ValueError
. Я рекомендую использовать формат .keras
, так как он является новым и более эффективным. Проверьте ваш код после внесения этих изменений, и он должен работать без ошибок.
Если у вас есть какие-либо другие вопросы или проблемы, не стесняйтесь обращаться. Успехов в вашей работе с классификацией изображений!