Python Keras根据阈值将中间层的输出设置为0或1

Python Keras根据阈值将中间层的输出设置为0或1,python,machine-learning,keras,lstm,Python,Machine Learning,Keras,Lstm,我有一个类似“分类”和“回归”的模型。我使用乘法层合并它们。在执行乘法之前,我想根据阈值将分类部分的输出设置为0或1。我试着使用Lambda层和下面的自定义函数,但是我面临着各种错误,对于这些错误我没有任何线索。一个接一个地解决这些问题并不能增加我的理解力。有人能解释一下如何定义修改值的自定义Lambda层函数吗 我的当前Lambda层功能:(由于失败的预处理错误:尝试使用未初始化的值lstm\u 32/bias而不工作) 分类部分: input1 = Input(shape=(1, )) mo

我有一个类似“分类”和“回归”的模型。我使用乘法层合并它们。在执行乘法之前,我想根据阈值将分类部分的输出设置为0或1。我试着使用Lambda层和下面的自定义函数,但是我面临着各种错误,对于这些错误我没有任何线索。一个接一个地解决这些问题并不能增加我的理解力。有人能解释一下如何定义修改值的自定义Lambda层函数吗

我的当前Lambda层功能:(由于
失败的预处理错误:尝试使用未初始化的值lstm\u 32/bias而不工作

分类部分:

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)
合并两部分:

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))

非常感谢。关于最后一段我有个问题。在运行m2.fit(X2,y2)之前是否应该运行model2.fit(X,y)以优化分类器?我还收到以下错误:ValueError:尝试将“X”转换为张量,但失败。错误:不支持任何值。我尝试了其他转换例程,但仍然面临ValueError。嗯,您必须在函数中使用
Lambda
层,请参见答案中的更新。如果您仍然得到none类型错误,可能是因为函数不可微。在编译完整模型之前,可以使用
model2.trainable=False
解决此问题。(如果您确实需要model2可培训,请告诉我)。是的,理想情况下,我希望model2可培训。