Tensorflow-训练时的Nan损失和恒定精度

时间:2018-11-08 06:33:34

标签: python tensorflow machine-learning artificial-intelligence

正如标题中所说,

我正在尝试训练神经网络来预测结果,但我无法弄清楚我的模型出了什么问题。我一直保持完全相同的准确度,而损失是Nan。我很困惑...我看过其他类似的问题,但似乎仍然无法正常工作。我的模型和训练代码如下:

import numpy as np
import pandas as pd
import tensorflow as tf
import urllib.request as request
import matplotlib.pyplot as plt
from FlowersCustom import get_MY_data

def get_data():
    IRIS_TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
    IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"

    names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'species']
    train = pd.read_csv(IRIS_TRAIN_URL, names=names, skiprows=1)
    test = pd.read_csv(IRIS_TEST_URL, names=names, skiprows=1)

    # Train and test input data
    Xtrain = train.drop("species", axis=1)
    Xtest = test.drop("species", axis=1)

    # Encode target values into binary ('one-hot' style) representation
    ytrain = pd.get_dummies(train.species)
    ytest = pd.get_dummies(test.species)

    return Xtrain, Xtest, ytrain, ytest


def create_graph(hidden_nodes):
    # Reset the graph
    tf.reset_default_graph()

    # Placeholders for input and output data
    X = tf.placeholder(shape=Xtrain.shape, dtype=tf.float64, name='X')
    y = tf.placeholder(shape=ytrain.shape, dtype=tf.float64, name='y')

    # Variables for two group of weights between the three layers of the network
    print(Xtrain.shape, ytrain.shape)
    W1 = tf.Variable(np.random.rand(Xtrain.shape[1], hidden_nodes), dtype=tf.float64)
    W2 = tf.Variable(np.random.rand(hidden_nodes, ytrain.shape[1]), dtype=tf.float64)

    # Create the neural net graph
    A1 = tf.sigmoid(tf.matmul(X, W1))
    y_est = tf.sigmoid(tf.matmul(A1, W2))

    # Define a loss function
    deltas = tf.square(y_est - y)
    loss = tf.reduce_sum(deltas)

    # Define a train operation to minimize the loss
    # optimizer = tf.train.GradientDescentOptimizer(0.005)
    optimizer = tf.train.AdamOptimizer(0.001)
    opt = optimizer.minimize(loss)

    return opt, X, y, loss, W1, W2, y_est


def train_model(hidden_nodes, num_iters, opt, X, y, loss, W1, W2, y_est):
    # Initialize variables and run session
    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)
    losses = []

    # Go through num_iters iterations
    for i in range(num_iters):
        sess.run(opt, feed_dict={X: Xtrain, y: ytrain})
        local_loss = sess.run(loss, feed_dict={X: Xtrain.values, y: ytrain.values})
        losses.append(local_loss)
        weights1 = sess.run(W1)
        weights2 = sess.run(W2)

        y_est_np = sess.run(y_est, feed_dict={X: Xtrain.values, y: ytrain.values})
        correct = [estimate.argmax(axis=0) == target.argmax(axis=0)
                   for estimate, target in zip(y_est_np, ytrain.values)]
        acc = 100 * sum(correct) / len(correct)

        if i % 10 == 0:
            print('Epoch: %d, Accuracy: %.2f, Loss: %.2f' % (i, acc, local_loss))

    print("loss (hidden nodes: %d, iterations: %d): %.2f" % (hidden_nodes, num_iters, losses[-1]))
    sess.close()
    return weights1, weights2


def test_accuracy(weights1, weights2):
    X = tf.placeholder(shape=Xtest.shape, dtype=tf.float64, name='X')
    y = tf.placeholder(shape=ytest.shape, dtype=tf.float64, name='y')
    W1 = tf.Variable(weights1)
    W2 = tf.Variable(weights2)
    A1 = tf.sigmoid(tf.matmul(X, W1))
    y_est = tf.sigmoid(tf.matmul(A1, W2))

    # Calculate the predicted outputs
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        y_est_np = sess.run(y_est, feed_dict={X: Xtest, y: ytest})

    # Calculate the prediction accuracy
    correct = [estimate.argmax(axis=0) == target.argmax(axis=0)
               for estimate, target in zip(y_est_np, ytest.values)]
    accuracy = 100 * sum(correct) / len(correct)
    print('final accuracy: %.2f%%' % accuracy)


def get_inputs_and_outputs(train, test, output_column_name):
    Xtrain = train.drop(output_column_name, axis=1)
    Xtest = test.drop(output_column_name, axis=1)
    ytrain = pd.get_dummies(getattr(train, output_column_name))
    ytest = pd.get_dummies(getattr(test, output_column_name))

    return Xtrain, Xtest, ytrain, ytest




if __name__ == '__main__':

    train, test = get_MY_data('output')

    Xtrain, Xtest, ytrain, ytest = get_inputs_and_outputs(train, test, 'output')#get_data()
    # Xtrain, Xtest, ytrain, ytest = get_data()

    hidden_layers = 10
    num_epochs = 500


    opt, X, y, loss, W1, W2, y_est = create_graph(hidden_layers)
    w1, w2 = train_model(hidden_layers, num_epochs, opt, X, y, loss, W1, W2, y_est)
    # test_accuracy(w1, w2)

以下是培训内容的屏幕截图: enter image description here

这是我用于输入数据(5列浮点数)的Pandas Dataframe的屏幕截图: enter image description here

最后,这是我用于预期输出的熊猫数据框(-1列或1列): enter image description here

1 个答案:

答案 0 :(得分:0)

这几乎总是输入数据的问题。

我建议详细检查要输入到模型中的值,以确保模型收到了您认为的内容。