web-dev-qa-db-ja.com

numpy配列を使用してKerasで重みを設定する方法は?

値を設定するためのKerasバックエンド機能に問題があります。モデルをPyTorchからKerasに変換しようとしています。Kerasモデルの重みを設定しようとしていますが、重みが設定されていないようです。注:実際には、例としてnp.onesを使用しているだけではありません。

私が試してみました...

既存のモデルをロードする

import keras
from keras.models import load_model, Model
model = load_model(model_dir+file_name)
keras_layer = [layer for layer in model.layers if layer.name=='conv2d_1'][0]

単純なモデルを作成する

img_input = keras.layers.Input(shape=(3,3,3))
x = keras.layers.Conv2D(1, kernel_size=1, strides=1, padding="valid", 
use_bias=False, name='conv1')(img_input)
model = Model(img_input, x)
keras_layer = [layer for layer in model.layers if layer.name=='conv1'][0]

次に、set_weightsまたはset_valueを使用します

keras_layer.set_weights([np.ones((1, 1, 3, 1))])

または...

K.batch_set_value([(weight,np.ones((1, 1, 3, 1))) for weight in keras_layer.weights])

その後、次のいずれかを呼び出します。

K.batch_get_value([weight for weight in keras_layer.weights])
keras_layer.get_weights()

そして、どの重みも設定されていないようです。前と同じ値が返されます。

[array([[[[  1.61547325e-06],
      [  2.97779252e-06],
      [  1.50160542e-06]]]], dtype=float32)]

Numpyの値の配列を使用してKerasのレイヤーの重みを設定するにはどうすればよいですか?

16
DeltaLee

コード内の_keras_layer_とは何ですか?

次の方法で重みを設定できます。

_model.layers[i].set_weights(listOfNumpyArrays)    
model.get_layer(layerName).set_weights(...)
model.set_weights(listOfNumpyArrays)
_

ここで、modelは既存のモデルのインスタンスです。上記の同じインスタンスのget_weights()メソッドを使用して、リストの予想される長さとその配列形状を確認できます。

24
Daniel Möller

Kerasのset_weights()メソッドは、numpy配列のリストを受け入れます。メソッドに渡したものは、単一の配列のように見えます。これの形状は、同じレイヤーのget_weights()の出力の形状と同じでなければなりません。コードは次のとおりです。

l=[]
x=np.array() #weights
y=np.array() #array of biases
l.append(x)
l.append(y)
loaded_model.layers[0].set_weights(l) #loaded_model.layer[0] being the layer

これは私にとってはうまくいき、get_weights()の呼び出しで更新された重みを返します。

7
Palak

PytorchモデルをKerasモデルに変換しようとしている場合は、 Pytorch2Keras コンバーターを試すこともできます。

Conv2d、Linear、Activations、いくつかの要素ごとの操作などの基本レイヤーをサポートしています。pytorch2keras/layers.pyレイヤー変換関数。

1
nerox8664