Проблема с сохранением обучаемой модели 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 шт):

Автор решения: CrazyElf

Прежде всего нужно читать документацию:

tf.keras.models.save_model(
    model, filepath, overwrite=True, **kwargs
)

Вы должны вызывать функцию save_model таким образом:

save_model(model, 'recognizing.h5')

А с методом save всё наоборот - параметр model ему не нужен, вы же уже от model этот метод вызываете:

model.save('recognizing.h5')
→ Ссылка
Автор решения: Wlad

Для решения проблемы сделал всего 2 шага: 1 - полностью переустановил пайтон 2 - перешёл по указанному в ошибке пути (из скрина postimg.cc/GHHG9dkt), нашёл файл init.py по этому пути была закомментированная строка

# Licensed under the Apache License, Version 2.0 (the "License");

так что я просто прописал в конце файла

__version__=2.0

поверить не могу, что после этого костыля код замечательно заработал без единой ошибки

→ Ссылка