Как создать модель обученного Кераса с помощью установки весов - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь преобразовать обученную модель цепочки в обученную модель керас в надежде преобразовать ее в coreml.Моя попытка сделать это состоит в том, чтобы напрямую установить веса моделированной модели keras с той же архитектурой, что и у модели с цепочкой.Посредством отладки я заметил, что формы весовых матриц меняются при настройке их в Керасе.Проблема в том, что выходы двух моделей различаются.В модели keras первый слой получает правильные результаты, но большинство обнуляется непредсказуемым образом.Есть ли другие параметры для обученной модели керас, которые мне не хватает?

import chainer
import cv2 as cv
import numpy as np
import argparse

import sys
import os

import evaluation_util
from keras.layers import merge, Convolution2D, Input

sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
import projection_gan

import keras
from keras.layers import Dense, Input, Activation
from keras.models import Model
from keras.utils import plot_model

def create_keras_model():
    inputs = Input(shape=(34,))

    l1 = Dense(1024, activation='relu')(inputs)
    l2 = Dense(1024, activation='relu')(l1)
    l3 = Dense(1024)(l2)
    l3 = keras.layers.add([l1,l3])
    l3 = Activation('relu')(l3)
    l4 = Dense(17)(l3)

    model = Model(inputs=inputs, outputs=l4)
    return model

def main(args):
    model = evaluation_util.load_model(vars(args))
    chainer.serializers.load_npz(args.lift_model, model)
    keras_model = create_keras_model()
    plot_model(keras_model, to_file='model.png')
    weights_list = [model.l1.W.array.transpose(), model.l1.b.array,
                    model.l2.W.array.transpose(), model.l2.b.array,
                    model.l3.W.array.transpose(), model.l3.b.array,
                    model.l4.W.array.transpose(), model.l4.b.array]
    keras_model.set_weights(weights_list)
    keras_model.save("keras.h5")

Пример вывода из первого слоя:

Цепочка (правильная модель):

0.012310047, -0,0038410246, 0,019623855, 0,01872946, -0,010116328, ...

Керас:

0,012310054, 0,0, 0,0, 0,01872946, 0,0, ...

1 Ответ

0 голосов
/ 20 января 2019

В кератах слой определяется вместе с функцией активации. В то время как слой L.Linear предназначен только для линейного режима, без какой-либо функции активации.

Поскольку вы определяете первый слой как l1 = Dense(1024, activation='relu')(inputs), это линейная операция , за которой следует операция relu , которая преобразует отрицательное значение в 0.

Именно поэтому выходные данные первого слоя вашей модели keras имеют неотрицательное значение.

Полагаю, с весом все в порядке.

...