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

标签 python machine-learning keras lstm

我有一个模型,其中有“分类”和“回归”之类的部分。我使用乘法层合并它们。在执行乘法之前,我想根据阈值将分类部分的输出设置为 0 或 1。我尝试将 Lambda 层与自定义函数一起使用,如下所示,但是我遇到了各种错误,并且我对这些错误一无所知。在我进行过程中一一解决它们并不能增加我的理解。谁能解释如何定义修改值的自定义 Lambda 层函数?

我当前的 Lambda 层函数:(由于 FailedPreconditionError:尝试使用未初始化值 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))

关于python - Keras根据阈值将中间层的输出设置为0或1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47034692/

相关文章:

python - 使用字符串代替 PY_VAR

math - 通过对用户名进行采样来推断网站用户群规模的方法

tensorflow - 两个平行的 conv2d 层 (keras)

python - 防止慢速查询耗尽 gunicorn 工作池

python - 如何假设 pandas 数据帧的值为 "default column"?

python - 如何切片张量的一部分?

machine-learning - 如果我提供 Keras 的其他图像,如何预测测试图像不是猫或狗?

autocomplete - 自动更正文档语料库

python - Keras Transfer Learning Resnet50 using fit_generator got high acc but low val_acc 问题

python - Tensorflow: `batch_size` 或 `steps` 输入数据需要 `Tensor` 或 `NumPy`