Ошибка значения: Неверное расширение пути файла для сохранения при сохранении модели CNN

Вопрос или проблема

Я постоянно работал над тем, чтобы научиться использовать классификацию изображений для своей программы на 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.

Решение проблемы:

  1. Изменение расширения файла:
    Чтобы исправить ошибку, вам следует изменить имя файла при вызове функции model.save() и использовать одно из следующих расширений:

    • Для сохранения в формате Keras (рекомендуемый способ):
      model.save('image_classifier.keras')
    • Для сохранения в формате HDF5:
      model.save('image_classifier.h5')
  2. Версии библиотек:
    Обратите внимание, что ваша версия TensorFlow (2.17) и Keras (3.5) поддерживают эти форматы. Поэтому использование этих расширений должно устранить вашу ошибку.

  3. Дополнительные советы:
    Если вы планируете использовать модель в других приложениях или для развертывания (например, TensorFlow Serving или TFLite), используйте метод model.export(filepath):

    model.export('image_classifier')

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

Итог:

Используйте правильное расширение для сохранения вашей модели, чтобы избежать ошибки ValueError. Я рекомендую использовать формат .keras, так как он является новым и более эффективным. Проверьте ваш код после внесения этих изменений, и он должен работать без ошибок.

Если у вас есть какие-либо другие вопросы или проблемы, не стесняйтесь обращаться. Успехов в вашей работе с классификацией изображений!

Оцените материал
Добавить комментарий

Капча загружается...