Конвертировать модель keras из python3.6.до 3,5 - PullRequest
0 голосов
/ 27 мая 2018

У меня есть модель, обученная керасу с python 3.6 и имеющая распбиан с python 3.5.

Когда вы загружаете модель (или, по крайней мере, мою модель), обученную с python 3.6, в python 3.6, вы получаете исключение:

IndexError: tuple index out of range

Проблема в том, что по разным причинам я не могуизмените платформу обучения на 3,5 или RPi на 3,6, поэтому мне нужно преобразовать model.h5.

Есть ли способ преобразовать h5 во что-то промежуточное и затем преобразовать из промежуточного в h5 на другой платформе?

Ошибка возникает, когда я вызываю load_module

Проблема заключается в том, что по разным причинам я не могу изменить тренировочную платформу на 3,5 или RPi на 3,6, поэтому мне нужно преобразовать de model.h5.

Есть ли способ преобразовать h5 во что-то промежуточное и затем преобразовать из промежуточного в h5 на другой платформе?

load_model("model1527371035.h5")    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 270, in load_model
    model = model_from_config(model_config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 347, in model_from_config
    return layer_module.deserialize(config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/__init__.py", line 55, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.5/dist-packages/keras/utils/generic_utils.py", line 144, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 1412, in from_config
    model.add(layer)
  File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 497, in add
    layer(x)
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/topology.py", line 619, in __call__
    output = self.call(inputs, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/core.py", line 685, in call
    return self.function(inputs, **arguments)
  File "<ipython-input-11-b85ceb3c6761>", line 64, in <lambda>
IndexError: tuple index out of range

Модель выглядит следующим образом:

model = Sequential()
model.add(Lambda(lambda x: x / 255.0 - 0.5, input_shape=(84, 84, 3)))
model.add(BatchNormalization())
model.add(Conv2D(36,(5,5), strides=(2,2), activation='relu'))
model.add(Dropout(dropout))
model.add(Conv2D(64,(3,3), activation='relu'))
model.add(Dropout(dropout))
model.add(Flatten())
model.add(Dropout(dropout))
model.add(Dense(40))
model.add(Dropout(dropout))
model.add(Dense(10))
model.add(Dense(6, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer="adam",metrics=['mae', 'acc'])

1 Ответ

0 голосов
/ 27 мая 2018

Правильно, глядя на комментарий с текущей проблемой , текущий обходной путь выглядит как просто сохранение и загрузка весов:

model.save_weights(filename)
# you have to rebuild model again
model.load_weights(filename)

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

РЕДАКТИРОВАТЬ: возможно, это влияет только на Lambda слоев, это может быть простой пользовательский слой , чтобы избежать этой проблемы:

class MyLayer(Layer):
   def call(self, x):
     return x / 255.0 - 0.5
...