如何通过设置权重创建训练有素的Keras模型

时间:2019-01-19 22:32:28

标签: python keras chainer

我正在尝试将训练有素的链接器模型转换为训练有素的keras模型,希望将其转换为coreml。我这样做的尝试是通过直接设置实例化keras模型的权重,使其具有与链接器模型相同的体系结构。通过调试,我注意到在Keras中设置权重矩阵的形状时会对其进行转置。问题是两个模型的输出不同。在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")

第一层的样本输出:

Chainer(正确的型号):

0.012310047,-0.0038410246、0.019623855、0.01872946,-0.010116328,...

凯拉斯:

0.012310054,0.0,0.0,0.01872946,0.0,...

1 个答案:

答案 0 :(得分:0)

在keras中,图层与激活功能一起定义。链接器L.Linear层仅用于线性操作,没有任何激活功能。

在将第一层定义为l1 = Dense(1024, activation='relu')(inputs)时,这是线性操作后跟relu操作,它将负值转换为0。

这就是为什么您的keras模型的第一层输出具有非负值。

我认为重量本身还可以。