[英]Keras set output of intermediate layer to 0 or 1 based on threshold
我有一个像零件一样具有“分类”和“回归”的模型。 我使用乘法层合并它们。 在执行乘法之前,我想根据阈值将分类部分的输出设置为 0 或 1。 我尝试使用带有自定义函数的 Lambda 层,如下所示,但是我遇到了各种错误,我对这些错误一无所知。 我一边走一边一一解决它们并没有增加我的理解。 谁能解释如何定义修改值的自定义 Lambda 层函数?
我当前的 Lambda 层函数:(由于FailedPreconditionError: Attempting to use uninitialized value lstm_32/bias
无法工作)
def func(x):
a = x.eval(session=tf.Session())
a[x < 0.5] = 0
a[x >= 0.5] = 1
return K.variable(a)
回归部分:
input1 = Input(shape=(1, ))
model = Sequential()
model.add(Embedding(vocab_size + 1, embedding, input_length=1))
model.add(LSTM(hidden, recurrent_dropout=0.1, return_sequences=True))
model.add(LSTM(6))
model.add(Reshape((3,2)))
model.add(Activation('linear'))
分类部分:
input2 = Input(shape=(1, ))
model2 = Sequential()
model2.add(Embedding(vocab_size + 1, embedding, input_length=1))
model2.add(LSTM(hidden, recurrent_dropout=0.1, return_sequences=True))
model2.add(LSTM(1))
model2.add(Activation('sigmoid'))
model2.add(???) # need to add 0-1 thresholding here
合并两部分:
reg_head = model(input1)
clf_head = model2(input2)
merge_head = multiply(inputs=[clf_head, reg_head])
m2 = Model(inputs=[input1, input2], outputs=merge_head)
在func
,您无法eval
张量。
使用张量的想法是它们在整个模型中从头到尾保持“连接”(他们称之为图)。 这种连接允许模型计算梯度。 如果您评估张量并尝试使用这些值,您将断开连接。
此外,为了获取张量的实际值,您需要输入数据。 并且输入数据仅在您调用fit
、 predict
和类似方法时才会存在。 在构建阶段,没有数据,只有表示和连接。
仅使用张量的可能函数是:
def func(x):
greater = K.greater_equal(x, 0.5) #will return boolean values
greater = K.cast(greater, dtype=K.floatx()) #will convert bool to 0 and 1
return greater
不过要小心! 这将无法区分。 从现在开始,这些值将被视为模型中的常量。 这意味着在此之前的权重不会在训练期间更新(您不会通过m2
训练分类模型,但您仍然可以从model2
训练它)。 有一些奇特的解决方法,如果您需要它们,请写评论。
在Lambda
层中使用此函数:
model.add(Lambda(func, output_shape=yourOutputShapeIfUsingTheano))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.