【问题标题】:Tensorflow custom estimator for logical 'AND'逻辑'AND'的Tensorflow自定义估计器
【发布时间】:2018-08-24 22:00:34
【问题描述】:

我正在尝试使用能够计算逻辑 AND 运算的 tensorflow 自定义估计器创建一个简单的单层/单单元 nn,但是我在激活 sigmoid 时遇到了问题——我想设置阈值

这是我的代码

x = np.array([
    [0, 0],
    [1, 0],
    [0, 1],
    [1, 1]
], dtype=np.float32)

y = np.array([
    [0],
    [0],
    [0],
    [1]
])

def sigmoid(val):
    res = tf.nn.sigmoid(val)
    isGreater = tf.greater(res, tf.constant(0.5))
    return tf.cast(isGreater, dtype=tf.float32)

def model_fn(features, labels, mode, params):
    predictions = tf.layers.dense(inputs=features, units=1, activation=sigmoid)

    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

    loss = tf.losses.sigmoid_cross_entropy(labels, predictions)
    optimizer = tf.train.GradientDescentOptimizer(0.5)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())

    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

nn = tf.estimator.Estimator(model_fn=model_fn)
input_fn = tf.estimator.inputs.numpy_input_fn(x=x, y=y, shuffle=False, num_epochs=None)

nn.train(input_fn=input_fn, steps=500)

但是这会引发错误

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables ["<tf.Variable 'dense/kernel:0' shape=(2, 1) dtype=float32_ref>", "<tf.Variable 'dense/bias:0' shape=(1,) dtype=float32_ref>"] and loss Tensor("sigmoid_cross_entropy_loss/value:0", shape=(), dtype=float32).

我该如何解决这个问题?请帮忙..

我遇到的另一个问题 - 为什么 Tensorflow 没有内置的 sigmoid 激活阈值?这不是二元分类最需要的东西之一(使用 sigmoid/tanh)吗?

【问题讨论】:

    标签: python tensorflow neural-network tensorflow-estimator sigmoid


    【解决方案1】:

    有一个内置的 sigmoid 激活,即tf.nn.sigmoid

    但是当您创建网络时,您应该永远不会在最后一层上使用激活。您需要向图层提供未划算的Logits,如下所示:

    predictions = tf.layers.dense(inputs=features, units=1, activation=None)
    
    loss = tf.losses.sigmoid_cross_entropy(labels, predictions)
    

    否则,通过您的自定义sigmoid,您的预测将是01 and,没有渐变可​​用。

    【讨论】:

    • 我刚刚意识到我只需要在这种情况下应用我的自定义 sigmoid 函数if mode == tf.estimator.ModeKeys.PREDICT:——所以我会得到 0/1 结果并且不会影响渐变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2019-04-20
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多