簡體   English   中英

如何通過設置權重創建訓練有素的Keras模型

[英]How to Create a Trained Keras Model Through Setting the Weights

我正在嘗試將訓練有素的鏈接器模型轉換為訓練有素的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")

第一層的樣本輸出:

鏈接器(正確的型號):

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

Keras:

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

在keras中,圖層與激活功能一起定義。 L.Linear層僅用於線性操作,沒有任何激活功能。

當您將第一層定義為l1 = Dense(1024, activation='relu')(inputs) ,這是線性運算, 后跟relu運算 ,它將負值轉換為0。

這就是為什么您的keras模型的第一層輸出具有非負值的原因。

我想重量本身還可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM