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

How to Create a Trained Keras Model Through Setting the Weights

我正在尝试将经过训练的 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, ...

在keras中,layer是和激活函数一起定义的。而chainer L.Linear层只是线性运算,没有任何激活函数。

当您将第一层定义为 l1 = Dense(1024, activation='relu')(inputs) 时,这是线性运算 ,然后是 relu 运算 ,它将负值转换为 0。

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

我想权重本身是可以的。