【问题标题】:how to convert output of a single neuron to class of 0 and 1 in tensorflow如何在张量流中将单个神经元的输出转换为 0 和 1 类
【发布时间】:2018-10-09 22:25:48
【问题描述】:

我在 Titanic 数据集上做了一个 NN。为了计算模型的精度,如果 Z3/A3​​ 高于 0.5,我希望输出为 1,否则为 0。

如果还有其他方法可以做这种事情。那么请告诉。

这是我的前向道具功能

def forward_prop(X, parameters):
    W1 = parameters['W1']
    W2 = parameters['W2']
    b1 = parameters['b1']
    b2 = parameters['b2']
    W3 = parameters['W3']
    b3 = parameters['b3']

    Z1 = tf.matmul(W1, tf.transpose(X))
    A1 = tf.nn.relu(tf.add(Z1, b1))
    Z2 = tf.matmul(W2, A1)
    A2 = tf.nn.relu(tf.add(Z2, b2))
    Z3 = tf.matmul(W3, A2)
    A3 = tf.nn.softmax(tf.add(Z3, b3))

    return A3

A3的输出形状是(1,1)

这是成本函数

def compute_cost(Z3, Y, m):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
        labels=tf.transpose(Y), logits=Z3))
    return cost

它以一些数字的形式给出输出...我希望输出为离散类,即 0 和 1。

请帮忙!!

【问题讨论】:

    标签: python-3.x tensorflow deep-learning data-science


    【解决方案1】:

    tf.nn.softmax() 计算类(输出神经元)的概率分布,如果你只有 1 个输出神经元,那么 1 个神经元的概率分布将始终为 1.0。我建议将tf.sigmoid()tf.greater() 结合使用,例如:

    A3 = tf.sigmoid(tf.add(Z3, b3))
    # ...
    prediction = tf.greater(A3, 0.5)
    
    如果 A3 大于 0.5,

    prediction 将返回 True,否则返回 False。 您可以将布尔 预测 转换为其他类型,例如整数:

    class_label = tf.cast(prediction, tf.int32)
    

    这样 True 将被转换为 1 和 False 为 0。 至于代价函数,使用tf.nn.sigmoid_cross_entropy_with_logits()

    cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.transpose(Y), logits=Z3))
    

    This post 有更多关于单神经元二元分类的详细信息,我建议您进一步研究一下。

    【讨论】:

    • 哈哈,现在是凌晨 3 点,我忘记了我的概念。我知道我忘记了一些东西,结果是 sigmoid。而且我不知道 tf.greater... 非常感谢 :)
    • @MohitSaini 您的代码可能包含错误,我更新了答案,请查看 *** 部分
    • 这是我的第一个模型:codeshare.io/5wDbAp。有什么改进建议吗?
    • @MohitSaini 我查看了代码,这不是错误,对此感到抱歉。否则看起来没问题,不过我没有运行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多