Keras - 在`compile()`之后修改lambda层

时间:2017-11-16 16:33:22

标签: python lambda keras keras-layer

在Keras中,如何在编译模型后更改lambda图层?

更具体地说,假设我想要一个lambda图层来计算private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { int indexRow = e.RowIndex; if (indexRow>=0) { DataGridViewRow row = dataGridView1.Rows[indexRow]; txtDelete.Text = row.Cells[0].Value.ToString(); } } y=a*x+ba每个时期都会被更改。

b

这会返回两次import keras from keras.layers import Input, Lambda, Dense import numpy as np np.random.seed(seed=42) a = 1 b = 2 def f(x, a, b): return a * x + b inputs = keras.layers.Input(shape=(3,)) lam = Lambda(f, arguments={"a": a, "b": b})(inputs) out = keras.layers.Dense(5)(lam) model = keras.models.Model(inputs, out) model.trainable = False model.compile(optimizer='rmsprop', loss='mse') x1 = np.random.random((10, 3)) x2 = np.random.random((10, 5)) model.fit(x1, x2, epochs=1) print("Updating. But that won't work") a = 10 b = 20 model.fit(x1, x2, epochs=1) ,其中应返回loss: 5.2914,然后loss: 5.2914

据我所知,这似乎是open issue可以通过编写自定义图层来解决,但我还没有让它工作。

欢迎任何指导。

1 个答案:

答案 0 :(得分:0)

如果您使用ab作为张量,即使在编译后也可以更改其值。

有两种方法。在一个方面,您将ab视为全局变量,并从函数外部获取它们:

import keras.backend as K

a = K.variable([1])
b = K.variable([2])

def f(x):
    return a*x + b #see the vars coming from outside here

#....

lam = Lambda(f)(inputs)

您可以随时手动拨打K.set_value(a,[newNumber])

K.set_value(a,[10])
K.set_value(b,[20])
model.fit(x1,x2,epochs=1)

在另一种方法中(我不知道是否有优势,但......听起来至少组织得更好),您可以将ab作为模型的输入:

a = K.variable([1])
b = K.variable([2])
aInput = Input(tensor=a)
bInput = Input(tensor=b)

def f(x):
    return x[0]*x[1] + x[2] #here, we input all tensors in the function

#.....

lam = Lambda(f)([inputs,aInput,bInput])

您可以像设置其他方法一样设置ab的值。