Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231

Как сохранить модель keras?

03.02.2021, 09:35. Показов 4567. Ответов 16

Студворк — интернет-сервис помощи студентам
Доброго времени суток, есть модель keras, при попытке сохранить через pickle вылетает ошибка:
TypeError: can't pickle _thread.RLock objects
При попытке сохранить базовыми средствами keras:
Python
1
2
from tensorflow.keras.models import load_model
        model = load_model("model.h5")
Вылетает ошибка:
Traceback (most recent call last):
File "main.py", line 677, in
run.main()
File "main.py", line 673, in main
model = load_model("model.h5")
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\engine\ saving.py", line 229, in load_model
model_config = json.loads(model_config.decode('utf-8'))
AttributeError: 'str' object has no attribute 'decode'

Что я не так делаю?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2021, 09:35
Ответы с готовыми решениями:

Keras - классификация текста - оверфиттинг, и как улучшить модель
Я делаю нейронную сеть для классификации текста на русском языке по этим примерам - ...

Как уменьшить размер тензора keras?
Доброго времени суток, есть тензор из 1628670 элементов, задача через reshape сделать его размеров (70, 20, 1), то есть имеющий 140...

Как сохранить модель Компас из V16 в V12?
Нужно сдать проект в лицее, но не знаю как сохранить так, чтобы загружалось в 13 компасе. Поэтому прошу вашей помощи.

16
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
03.02.2021, 10:32
Не благодари:
Цитата Сообщение от Andrei_ Посмотреть сообщение
AttributeError: 'str' object has no attribute 'decode'
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
03.02.2021, 18:57
Цитата Сообщение от Andrei_ Посмотреть сообщение
model = load_model("model.h5")
Это не сохранение, а загрузка модели:
https://www.tensorflow.org/tut... e_and_load
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
04.02.2021, 20:22  [ТС]
Да, читал документацию
Дело в том, что при использовании версии h5py==3.0.0 и выше вылетает ошибка:
AttributeError: 'str' object has no attribute 'decode'
А при использовании версий ниже летит:
AttributeError: 'NoneType' object has no attribute 'get'
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
04.02.2021, 21:07
Цитата Сообщение от Andrei_ Посмотреть сообщение
Да, читал
У меня работает, только сегодня сохранил и загрузил полсотни моделей
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
04.02.2021, 22:51  [ТС]
У меня Python 3.7.0, tensorflow 1.12.0, h5py 2.9.0
Но все равно при попытке загрузки модели получаю:
Traceback (most recent call last):
File "main.py", line 679, in <module>
run.main()
File "main.py", line 674, in recognition
model = load_model("main.h5")
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\engine\ saving.py", line 230, in load_model
model = model_from_config(model_config, custom_objects=custom_objects)
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\engine\ saving.py", line 310, in model_from_config
return deserialize(config, custom_objects=custom_objects)
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\layers\ serialization.py", line 64, in deserialize
printable_module_name='layer')
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\utils\g eneric_utils.py", line 173, in deserialize_keras_object
list(custom_objects.items())))
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\engine\ network.py", line 1292, in from_config
process_layer(layer_data)
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\engine\ network.py", line 1278, in process_layer
layer = deserialize_layer(layer_data, custom_objects=custom_objects)
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\layers\ serialization.py", line 64, in deserialize
printable_module_name='layer')
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\utils\g eneric_utils.py", line 173, in deserialize_keras_object
list(custom_objects.items())))
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\layers\ core.py", line 800, in from_config
printable_module_name='function in Lambda layer')
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow\python\keras\utils\g eneric_utils.py", line 190, in deserialize_keras_object
fn = module_objects.get(function_name)
AttributeError: 'NoneType' object has no attribute 'get'
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
05.02.2021, 09:51
Цитата Сообщение от Andrei_ Посмотреть сообщение
У меня Python 3.7.0, tensorflow 1.12.0
У меня tensorflow 2.3

Сделайте отладочный кусок программы - из десятка строк создайте, сохраните и загрузите модель.
Разбираться в сотнях строках Вашей программы времени и желания нет
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
05.02.2021, 19:09  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class KKK():
    
    def model(self, input_shape):
        seq = Sequential()
        seq.add(Conv2D(6, 3, 3, activation="relu", input_shape=input_shape, padding='valid', data_format="channels_last"))
        seq.add(MaxPooling2D(pool_size=(2, 2)))
        seq.add(Dropout(0.25))
        seq.add(Conv2D(12, 3, 3, activation="relu", padding='valid', data_format="channels_last"))
        seq.add(MaxPooling2D(pool_size=(2, 2), data_format='channels_last'))
        seq.add(Dropout(0.25))
        seq.add(Flatten())
        seq.add(Dense(128, activation='relu'))
        seq.add(Dropout(0.1))
        seq.add(Dense(50, activation='relu'))
        return seq
 
    def euclidean_distance(self, vects):
        x, y = vects
        return K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))
 
    def eucl_dist_output_shape(self, shapes):
        shape1, shape2 = shapes
        return (shape1[0], 1)
 
    def contrastive_loss(self, y_true, y_pred):
        margin = 1
        return K.mean(y_true * K.square(y_pred) + (1 - y_true) * K.square(K.maximum(margin - y_pred, 0)))
 
    def train(self):
        X, Y = self.get_data()
        X.shape = (20000, 2, 56, 46, 1)
        x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=.25)
        input_dim = x_train.shape[2:]
        img_a = Input(shape=input_dim)
        img_b = Input(shape=input_dim)
        base_network = self.model(input_dim)
        feat_vecs_a = base_network(img_a)
        feat_vecs_b = base_network(img_b)
        distance = Lambda(self.euclidean_distance, output_shape=self.eucl_dist_output_shape)([feat_vecs_a, feat_vecs_b])
        rms = RMSprop()
        model = Model(inputs=[img_a, img_b], outputs=distance)
        model.compile(loss=self.contrastive_loss, optimizer=rms)
        model.save("model.h5")
 
from tensorflow.keras.models import load_model
model = load_model("model.h5")
Добавлено через 1 минуту
K=from tensorflow.keras import backend as K
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
06.02.2021, 01:24  [ТС]
Хотя странно, простая модель для классификации mnist легко сохранилась
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
06.02.2021, 09:48
Цитата Сообщение от Andrei_ Посмотреть сообщение
fn = module_objects.get(function_name)
AttributeError: 'NoneType' object has no attribute 'get'
Может проблема тут:
Цитата Сообщение от Andrei_ Посмотреть сообщение
X, Y = self.get_data()
???
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
06.02.2021, 10:16  [ТС]
X.shape = (20000, 2, 1, 56, 46)
Y.shape = (20000, 1)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.02.2021, 16:24
Лучший ответ Сообщение было отмечено Andrei_ как решение

Решение

Цитата Сообщение от Andrei_ Посмотреть сообщение
fn = module_objects.get(function_name)
Найди в эту строчку в библиотеке и посмотри есть ли там выше строчка
Python
1
module_objects = module_objects or {}
Если нет, то понятно почему падает. Эта строчка - защита от NoneType. У пустого словаря метод get всегда есть.
Правда, ошибка будет и в этом случае, но уже задуманная самими разработчиками:
Python
1
2
3
cls = module_objects.get(class_name)
if cls is None:
    raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)


P.S. А вообще нужно использовать более свежую версию tensorflow. Та что у тебя, видимо, имеет или баги или просто не умеет сохранять некоторые модели.
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
07.02.2021, 01:16  [ТС]
Нет, там такого нет:
Python
1
2
3
4
5
6
7
8
9
10
11
elif isinstance(identifier, six.string_types):
    function_name = identifier
    if custom_objects and function_name in custom_objects:
      fn = custom_objects.get(function_name)
    elif function_name in _GLOBAL_CUSTOM_OBJECTS:
      fn = _GLOBAL_CUSTOM_OBJECTS[function_name]
    else:
      fn = module_objects.get(function_name)
      if fn is None:
        raise ValueError('Unknown ' + printable_module_name + ':' +
                         function_name)
Дело в том, что у меня процессор intel pentium N5000, не поддерживающий инструкции AVX, и сборка бралась отсюда:
https://github.com/f040225/ten... 7/CPU/sse2

Добавлено через 24 минуты
Установил посвежее версию-2.0.0, это самая свежая версия CPU, которую я смог найти
История та же:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
elif isinstance(identifier, six.string_types):
    object_name = identifier
    if custom_objects and object_name in custom_objects:
      obj = custom_objects.get(object_name)
    elif object_name in _GLOBAL_CUSTOM_OBJECTS:
      obj = _GLOBAL_CUSTOM_OBJECTS[object_name]
    else:
      obj = module_objects.get(object_name)
      if obj is None:
        raise ValueError('Unknown ' + printable_module_name + ':' + object_name)
    # Classes passed by name are instantiated with no args, functions are
    # returned as-is.
    if tf_inspect.isclass(obj):
      return obj()
    return obj
  else:
    raise ValueError('Could not interpret serialized ' + printable_module_name +
                     ': ' + identifier)
Добавлено через 2 минуты
Здесь все падает на 208 строке:
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow_core\python\keras\ut ils\generic_utils.py", line 208, in deserialize_keras_object
obj = module_objects.get(object_name)
AttributeError: 'NoneType' object has no attribute 'get'

Но, что интересно, в файле generic_utils.py на 162 строке такая проверка есть:
Python
1
2
3
4
5
6
else:
    module_objects = module_objects or {}
    cls = module_objects.get(class_name)
    if cls is None:
      raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
  return (cls, config['config'])
Добавлено через 3 минуты
Дописал проверку, но теперь obj=None:
Python
1
2
3
4
5
else:
      module_objects = module_objects or {}
      obj = module_objects.get(object_name)
      if obj is None:
        raise ValueError('Unknown ' + printable_module_name + ':' + object_name)
И летит следующее предупреждение:
File "C:\Users\user\AppData\Local\Programs\Py thon\Python37\lib\site-packages\tensorflow_core\python\keras\ut ils\generic_utils.py", line 212, in deserialize_keras_object
raise ValueError('Unknown ' + printable_module_name + ':' + object_name)
ValueError: Unknown function in Lambda layer:euclidean_distance

Видимо я неправильно Lambda-слой объявил
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
07.02.2021, 01:17
Цитата Сообщение от Andrei_ Посмотреть сообщение
Но, что интересно, в файле generic_utils.py на 162 строке такая проверка есть
Может у тебя не та версия tensorflow стартует? Если проверка есть, именно такой ошибки быть не может.

Python
1
2
3
4
>>> module_objects = None or {}
>>> module_objects.get
<built-in method get of dict object at 0x0000000003025040>
>>>
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
07.02.2021, 01:20  [ТС]
Я оставил только самую свежую версию tensorflow
Вот, к слову, Lambda-слой, на который и жалуется tensorflow:
Python
1
distance = Lambda(self.euclidean_distance, output_shape=self.eucl_dist_output_shape)([feat_vecs_a, feat_vecs_b])
Добавлено через 53 секунды
Функция euclidean_distance(находится в классе):
Python
1
2
3
def eucl_dist_output_shape(self, shapes):
        shape1, shape2 = shapes
        return (shape1[0], 1)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
07.02.2021, 01:23
Цитата Сообщение от Andrei_ Посмотреть сообщение
Установил посвежее версию-2.0.0, это самая свежая версия CPU
Тоже без поддержки AVX (для Python 3.8):
Python
1
2
3
>>> tensorflow.__version__
'2.1.0'
>>>
0
0 / 0 / 0
Регистрация: 04.08.2020
Сообщений: 231
07.02.2021, 01:58  [ТС]
А откуда вы ее ставили?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2021, 01:58
Помогаю со студенческими работами здесь

Как сохранить координаты маркера из ГуглМап в модель ГеоДжанго?
models.py: class Location(models.Model): name = models.CharField(max_length=100, verbose_name=u&quot;Локация&quot;, default=u'') ...

Flask-WTF: как сохранить модель со связью One-to-Many в базу данных?
Есть две модели Datacener и Server с общей связью ForeigKey, при попытке создать новую модель Server, форма не проходит валидацию. При...

Как отобразить результат модели в keras?
Добрый день. Есть обученная модель. Определяет где машина, где велосипед. Решил проверить на тестовых изображениях (чтобы модель...

Автоматически сохранить модель в файл после внесённых изменений?
Как автоматически сохранить модель в файл после внесённых изменений? Логика ожидаемая: - пользователь установил значение в...

Как обучить LSTM (Keras) на видео переменной длины?
Допустим, имеются такие входные данные: x1 = np.random.random((10,3)) x2 = np.random.random((5,3)) , где x - видео. Число строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru