如何通过设置权重来建立训练的Keras模型

2024-05-16 15:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个经过训练的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。。。你知道吗


Tags: from模型importl1modelarraykerasdense
1条回答
网友
1楼 · 发布于 2024-05-16 15:20:35

在keras中,层与激活函数一起定义。而chainerL.Linear层仅用于线性运算,没有任何激活函数。你知道吗

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

这就是为什么keras模型的第一层输出值是非负值。你知道吗

我想重量本身是可以的。你知道吗

相关问题 更多 >