我正在尝试将训练有素的链接器模型转换为训练有素的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,...
答案 0 :(得分:0)
在keras中,图层与激活功能一起定义。链接器L.Linear
层仅用于线性操作,没有任何激活功能。
在将第一层定义为l1 = Dense(1024, activation='relu')(inputs)
时,这是线性操作后跟relu操作,它将负值转换为0。
这就是为什么您的keras模型的第一层输出具有非负值。
我认为重量本身还可以。