ValueError: вы пытаетесь загрузить файл весов, содержащий 6 слоев, в модель с 0 - PullRequest
0 голосов
/ 01 января 2019

У меня есть простая модель керас.После того, как модель сохранена.Я не могу загрузить модель.Это ошибка, которую я получаю после создания экземпляра модели и попытки загрузки весов:

Using TensorFlow backend.
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    model = load_model("test.h5")
  File "/usr/lib/python3.7/site-packages/keras/engine/saving.py", line 419, in load_model
  model = _deserialize_model(f, custom_objects, compile)
  File "/usr/lib/python3.7/site-packages/keras/engine/saving.py", line 258, in _deserialize_model
.format(len(layer_names), len(filtered_layers))
 ValueError: You are trying to load a weight file containing 6 layers into a model with 0 layers

Для создания экземпляра модели и использования model.load_weights и составления сводки модели.Я получаю None, когда печатаю модель, используя print (model)

Traceback (most recent call last):
File "test.py", line 7, in <module>
    print(model.summary())
AttributeError: 'NoneType' object has no attribute 'summary'

Вот моя Сеть:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, InputLayer, Flatten,    Dense, BatchNormalization


def create_model():
    kernel_size = 5
    pool_size = 2
    batchsize = 64
    model = Sequential()
    model.add(InputLayer((36, 120, 1)))
    model.add(Conv2D(filters=20, kernel_size=kernel_size,    activation='relu', padding='same'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size))
    model.add(Conv2D(filters=50, kernel_size=kernel_size, activation='relu', padding='same'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size))
    model.add(Flatten())
    model.add(Dense(120, activation='relu'))
    model.add(Dense(2, activation='relu'))
    return model

Сценарий процедуры обучения:

import numpy as np
from keras import optimizers
from keras import losses
from sklearn.model_selection import train_test_split
from model import create_model


def data_loader(images, pos):
    while(True):
        for i in range(0, images.shape[0], 64):
            if (i+64) < images.shape[0]:
                img_batch = images[i:i+64]
                pos_batch = pos[i:i+64]
                yield img_batch, pos_batch
            else:
                img_batch = images[i:]
                pos_batch = pos[i:]
                yield img_batch, pos_batch


def main():
    model = create_model()
    sgd = optimizers.Adadelta(lr=0.01, rho=0.95, epsilon=None, decay=0.0)
    model.compile(loss=losses.mean_squared_error, optimizer=sgd)
    print("traning")
    data = np.load("data.npz")
    images = data['images']
    pos = data['pos']
    x_train, x_test, y_train, y_test = train_test_split(images, pos, test_size=0.33, random_state=42)
    model.fit_generator(data_loader(x_train, y_train), steps_per_epoch=x_train.shape[0]//64, validation_data=data_loader(x_test, y_test), \
                    validation_steps = x_test.shape[0]//64, epochs=1)
    model.save('test.h5')
    model.save_weights('test_weights.h5')

    print("training done")


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 01 января 2019
  1. Отбросьте InputLayer и используйте input_shape в первом слое.Ваш код будет похож на:

    model = Sequentional()
    model.add(Conv2D(filters=20,..., input_shape=(36, 120, 1)))

    Кажется, модели с InputLayer не сериализуются в HDF5 правильно .

  2. Обновите ваш Tensorflow и Keras до последней версии

  3. Устраните проблему интерпретатора, как объяснено здесь

...