Keras根据阈值

时间:2017-10-31 11:49:36

标签: python machine-learning keras lstm

我的模型有“分类”和“回归”之类的部分。我使用乘法层合并它们。在执行乘法之前,我想根据阈值将分类部分的输出设置为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)

1 个答案:

答案 0 :(得分:2)

func中,您无法eval张量。

使用张量的想法是,它们在整个模型中始终保持“连接”(图形,就像它们所称的那样)。此连接允许模型计算梯度。如果您评估张量并尝试使用这些值,则会断开连接。

此外,要获取张量的实际值,您需要输入数据。输入数据仅在您调用fitpredict和类似方法时才存在。在构建阶段,没有数据,只有表示和连接。

仅使用张量的可能功能是:

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(Lamnda(func,output_shape=yourOtputShapeIfUsingTheano))