値を設定するための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のレイヤーの重みを設定するにはどうすればよいですか?
コード内の_keras_layer
_とは何ですか?
次の方法で重みを設定できます。
_model.layers[i].set_weights(listOfNumpyArrays)
model.get_layer(layerName).set_weights(...)
model.set_weights(listOfNumpyArrays)
_
ここで、model
は既存のモデルのインスタンスです。上記の同じインスタンスのget_weights()
メソッドを使用して、リストの予想される長さとその配列形状を確認できます。
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()の呼び出しで更新された重みを返します。
PytorchモデルをKerasモデルに変換しようとしている場合は、 Pytorch2Keras コンバーターを試すこともできます。
Conv2d、Linear、Activations、いくつかの要素ごとの操作などの基本レイヤーをサポートしています。pytorch2keras/layers.py
レイヤー変換関数。