我正在尝试将一个经过训练的chainer模型转换成一个经过训练的keras模型,希望将其转换成coreml。我这样做的尝试是通过直接设置实例化keras模型的权重,该模型的体系结构与chainer模型相同。通过调试,我注意到在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")
第一层输出示例:
锚链器(正确型号):
0.012310047,-0.0038410246,0.019623855,0.01872946,-0.010116328。。。你知道吗
凯拉斯:
0.012310054,0.0,0.0,0.01872946,0.0。。。你知道吗
在keras中,层与激活函数一起定义。而chainer
L.Linear
层仅用于线性运算,没有任何激活函数。你知道吗当您将第一层定义为
l1 = Dense(1024, activation='relu')(inputs)
时,这是线性运算,然后是relu运算,它将负值转换为0。你知道吗这就是为什么keras模型的第一层输出值是非负值。你知道吗
我想重量本身是可以的。你知道吗
相关问题 更多 >
编程相关推荐