【问题标题】:Accuracy bad even after implementing deep neural net即使在实施深度神经网络后精度也很差
【发布时间】:2019-01-19 06:31:21
【问题描述】:

我的神经网络试图预测一个人是否患有糖尿病,这是我的数据集 kaggle.com/uciml/pima-indians-diabetes-database。 我使用的是 3 层神经网络,我的准确率为 65%。
任何提高准确性的帮助将不胜感激。

这是我的代码------------------------------------------- ---------------

import numpy as np
import tensorflow as tf
import pandas as pd

df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')

actualY=df['Outcome']
actualX=df.drop(['Outcome'],axis=1)
actualX=np.array(np.reshape(actualX,newshape=[768,8]))
actualY=np.array(np.reshape(actualY,newshape=[768,1]))
#Y=[768,1]
#X=[768,8]
x=tf.placeholder(dtype=tf.float64,shape=[768,8])
W1=tf.Variable(dtype=np.float64,initial_value=np.random.random((8,500)))
B1=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction1=((tf.add(tf.matmul(x,W1),B1)))
output1=tf.nn.sigmoid(y_prediction1)
W2=tf.Variable(dtype=np.float64,initial_value=np.random.random((500,600)))
B2=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction2=((tf.add(tf.matmul(output1,W2),B2)))
output2=tf.nn.sigmoid(y_prediction2)
W3=tf.Variable(dtype=np.float64,initial_value=np.random.random((600,1)))
B3=tf.Variable(dtype=np.float64,initial_value=np.random.random((1,1)))
y_prediction3=((tf.add(tf.matmul(output2,W3),B3)))


y_true=tf.placeholder(dtype=tf.float64,shape=[768,1])

loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=y_prediction3,labels=y_true))



optimizer=tf.train.GradientDescentOptimizer(0.01).minimize(loss)
sess=tf.Session()
sess.run(tf.global_variables_initializer())


for i in range(200):
    (sess.run(optimizer,feed_dict={x:actualX,y_true:actualY}))
     print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
    print(i)
prediction = tf.round(tf.sigmoid((y_prediction3)))

correct = tf.cast(tf.equal(prediction, y_true), dtype=np.float64)

accuracy = tf.reduce_mean(correct)
print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))

【问题讨论】:

    标签: python-3.x tensorflow neural-network floating-accuracy sigmoid


    【解决方案1】:

    数据集比较小,模型参数选择要慎重。

    我从您的代码中无法理解的内容很少。这是一个二元分类,对吧?如果是这样,您应该有一个单热编码输出和大小为 2 的 GT。在您的代码中,似乎每个示例只有一个输出!如果要将 GT 保留为向量,则应使用 tf.nn.sparse_softmax_cross_entropy_with_logits 代替。 在与prediction 进行比较之前,您不应该在y_true 上使用softmax 和argmax 吗?也检查那部分。

    如果您的代码一切正常,我也会考虑以下建议:

    • 减少隐藏单元的数量(例如 128 或 256)
    • 不确定为什么要使用大小为 (1,1) 的偏差,它应该是一个带有输出数量的向量(即在您的示例中为 B1 = tf.Variable(tf.random_normal([500]))
    • 对权重使用 Xavier init,对偏差使用零初始化
    • 如果网络开始过度拟合训练集,则添加 dropout 层
    • 尝试 Adam 选择并交叉验证学习率(或保留当前选择并更改学习率)
    • 使用小批量(目前您正在做的是 GD 而不是 SGB,我认为这更有可能陷入局部最小值)
    • 使用 relu 代替 sigmoid 激活
    • 绘制学习曲线并检查网络是否训练正常(即准确度在增加,损失在减少)

    无论如何,使用这个小数据集,您应该很容易过度拟合训练集。在 200 个 epoch 后获得 65% 清楚地表明你的模型有问题。仔细检查您的代码并确保其中没有任何问题。你可以以这个code 为例。

    更新1: 你必须有一个热编码输出!在您的情况下,它是维度 2。检查此代码,我对您的代码做了一些修改,但我没有运行它。解决任何可能的错误并尝试使其运行:

    import numpy as np
    import tensorflow as tf
    import pandas as pd
    
    df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')
    
    actualY=df['Outcome']
    actualX=df.drop(['Outcome'],axis=1)
    actualX=np.array(np.reshape(actualX,newshape=[768,8]))
    actualY=np.array(np.reshape(actualY,newshape=[768,1]))
    #Y=[768,1]
    #X=[768,8]
    
    x = tf.placeholder('float',,shape=[None,8])
    y_true = tf.placeholder('float',,shape=[None,1])
    
    W1 = tf.get_variable("W1", shape=[8, 128],initializer=tf.contrib.layers.xavier_initializer())
    b1 = tf.get_variable("b1", shape=[128],initializer=initializer=tf.zeros_initializer())
    h1 = tf.nn.relu(tf.add(tf.matmul(x,W1),b1))
    
    W2 = tf.get_variable("W2", shape=[128, 128],initializer=tf.contrib.layers.xavier_initializer())
    b2 = tf.get_variable("b2", shape=[128],initializer=initializer=tf.zeros_initializer())
    h2 = tf.nn.relu(tf.add(tf.matmul(h1,W2),b2))
    
    W3 = tf.get_variable("W3", shape=[128, 2],initializer=tf.contrib.layers.xavier_initializer())
    b3 = tf.get_variable("b3", shape=[2],initializer=initializer=tf.zeros_initializer())
    logits = tf.add(tf.matmul(h2,W3),b3)
    
    
    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits,labels=tf.one_hot(y_true)))
    optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)
    
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    
    
    for i in range(200):
        sess.run(optimizer,feed_dict={x:actualX,y_true:actualY})
        print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
        print(i)
    
    
    pred = tf.nn.softmax(logits)
    correct_prediction = tf.equal(tf.argmax(pred, 1), y_true)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))
    

    【讨论】:

    • y_true 是一个 768,1 矩阵,它只有一个值(0 或 1),y_prediction3 的 sigmoid 也只给出一个值(0 或 1)......我使用 sigmoid_cross_entropy ...(PS:我是这方面的初学者,所以你能帮我实现 tf.nn.sparse_softmax_cross_entropy_with_logits 来解决问题)
    • 2:我改变了偏置维度
    • 损失似乎在减少,但在某个点之后它变成一个常数 0.6412223
    • 4:Idk如何实现随机梯度下降
    • 我注意到输出的一件事是 tf.round(tf.nn.sigmoid(y_prediction3))
    【解决方案2】:

    这是我运行的代码

    import numpy as np
    import tensorflow as tf
    import pandas as pd
    
    df=pd.read_csv(r'C:\Users\manas\Downloads\diabetes.csv')
    
    actualY=df['Outcome']
    actualX=df.drop(['Outcome'],axis=1)
    actualX=np.array(np.reshape(actualX,newshape=[768,8]))
    actualY=np.array(np.reshape(actualY,newshape=[768,1]),dtype=int)
    #Y=[768,1]
    #X=[768,8]
    
    x = tf.placeholder('float',shape=[None,8])
    y_true = tf.placeholder(shape=[None,1],dtype=tf.int64)
    
    W1 = tf.get_variable("W1", shape=[8, 
    128],initializer=tf.contrib.layers.xavier_initializer())
    b1 = tf.get_variable("b1", shape=[128],initializer=tf.zeros_initializer())
    h1 = tf.nn.relu(tf.add(tf.matmul(x,W1),b1))
    
    
    W2 = tf.get_variable("W2", shape=[128, 
    128],initializer=tf.contrib.layers.xavier_initializer())
    b2 = tf.get_variable("b2", shape=[128],initializer=tf.zeros_initializer())
    h2 = tf.nn.relu(tf.add(tf.matmul(h1,W2),b2))
    
    W3 = tf.get_variable("W3", shape=[128, 
    2],initializer=tf.contrib.layers.xavier_initializer())
    b3 = tf.get_variable("b3", shape=[2],initializer=tf.zeros_initializer())
    logits = tf.add(tf.matmul(h2,W3),b3)
    
    
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=tf.one_hot(y_true,depth=2)))
    
    optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)
    
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    
    for i in range(3000):
        sess.run(optimizer,feed_dict={x:actualX,y_true:actualY})
        print(i,sess.run(loss, feed_dict={x: actualX, y_true: actualY}))
        print(i)
    
    
    pred = tf.nn.softmax(logits)
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.arg_max(y_true,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    
    print(sess.run(tf.round(tf.nn.softmax(logits)),feed_dict={x:actualX,y_true:actualY}))
    
    print(sess.run(accuracy,feed_dict={x: actualX, y_true: actualY}))
    

    虽然这会损失0.14772553,但其准确度是64.564555 %

    所以我真的不知道问题出在哪里。

    【讨论】:

    • 你能添加损失和准确度图吗?
    • 我不知道该怎么做
    • 对于每个 epoch 保存损失和准确率值,并在训练完成后绘制它们。
    猜你喜欢
    • 2017-07-23
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2019-12-02
    • 1970-01-01
    • 2020-08-09
    • 2017-01-24
    相关资源
    最近更新 更多