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

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

03.02.2021, 09:35. Показов 4631. Ответов 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
2696 / 1602 / 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru