Проблема с сохранением обучаемой модели tensorflow
Настрочил (накопипастил из чата гпт) код, цель которого обучить модель распознавать цифры заготовленного шрифта, однако возникла проблема с сохранением данной модели. Прикладываю код:
import numpy as np
from tensorflow.python.keras.engine.sequential import Sequential
from tensorflow.python.keras.layers import Dense, Conv2D, Flatten, MaxPooling2D
from tensorflow.python.keras.utils.np_utils import to_categorical
from tensorflow.python.keras.models import save_model, load_model
from sklearn.model_selection import train_test_split
from PIL import Image, ImageOps
import os
from tensorflow.python.keras.engine import data_adapter
def _is_distributed_dataset(ds):
return isinstance(ds, data_adapter.input_lib.DistributedDatasetSpec)
data_adapter._is_distributed_dataset = _is_distributed_dataset
# Функция для масштабирования изображения с сохранением пропорций и добавлением отступов
def resize_and_pad(img, target_size):
try:
img.thumbnail((target_size[1], target_size[0]), Image.Resampling.LANCZOS)
except AttributeError:
img.thumbnail((target_size[1], target_size[0]), Image.LANCZOS)
delta_w = target_size[1] - img.size[0]
delta_h = target_size[0] - img.size[1]
padding = (delta_w // 2, delta_h // 2, delta_w - (delta_w // 2), delta_h - (delta_h // 2))
new_img = ImageOps.expand(img, padding)
return new_img
# Функция для загрузки изображений
def load_images_from_folder(folder, target_size):
images = []
labels = []
for filename in os.listdir(folder):
if filename.endswith('.jpg'):
label = int(filename.split('.')[0]) # Предполагается, что имя файла - это цифра (0.png, 1.png и т.д.)
img_path = os.path.join(folder, filename)
img = Image.open(img_path).convert('L') # Конвертируем в grayscale
img = resize_and_pad(img, target_size) # Масштабируем и добавляем отступы
img = np.array(img)
img = img.reshape(target_size[0], target_size[1], 1).astype('float32') / 255 # Нормализуем и меняем форму
images.append(img)
labels.append(label)
return np.array(images), np.array(labels)
# Загрузка изображений и меток
target_size = (15, 10)
X, y = load_images_from_folder(r'C:\projects\size', target_size)
# Разделение данных на обучающую и тестовую выборки
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# Преобразование меток классов в формат one-hot encoding
y_train = to_categorical(y_train, 10)
y_val = to_categorical(y_val, 10)
# Создание модели
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(15, 10, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Обучение модели
model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
model.save(model, 'recognizing.h5')
# model = save_model(r'.\recognizing.h5')
# Функция для предсказания цифры
def predict_digit(img_path, model):
img = Image.open(img_path).convert('L')
img = resize_and_pad(img, target_size)
img = np.array(img)
img = img.reshape(target_size[0], target_size[1], 1).astype('float32') / 255
img = np.expand_dims(img, axis=0)
prediction = model.predict(img)
return np.argmax(prediction, axis=1)[0]
# Пример использования функции для предсказания цифры
# digit = predict_digit('path_to_image_of_digit.png', model)
# print(f'Predicted digit: {digit}')
При использовании функции (скрин 1) появляется следующая ошибка Traceback (most recent call last): File "c:\projects\qwerty.py", line 73, in model = save_model(r'.\recognizing.h5')
При использовании же метода возникают следующие ошибки. Сколько я ни гуглил, сколько ни спрашивал у чата ГПТ, ничего не помогло решить проблему, даже проверял, достаточно ли у меня прав, чтобы использовать папки для импорта
Ответы (2 шт):
Прежде всего нужно читать документацию:
tf.keras.models.save_model(
model, filepath, overwrite=True, **kwargs
)
Вы должны вызывать функцию save_model
таким образом:
save_model(model, 'recognizing.h5')
А с методом save
всё наоборот - параметр model
ему не нужен, вы же уже от model
этот метод вызываете:
model.save('recognizing.h5')
Для решения проблемы сделал всего 2 шага: 1 - полностью переустановил пайтон 2 - перешёл по указанному в ошибке пути (из скрина postimg.cc/GHHG9dkt), нашёл файл init.py по этому пути была закомментированная строка
# Licensed under the Apache License, Version 2.0 (the "License");
так что я просто прописал в конце файла
__version__=2.0
поверить не могу, что после этого костыля код замечательно заработал без единой ошибки