为回归数据设计高效的神经网络

时间:2017-08-20 00:48:04

标签: python machine-learning tensorflow neural-network artificial-intelligence

通过阅读关于Tensorflow的教程并阅读有关神经网络的一些基本知识,我使用python和Tensorflow库建模神经网络。

截至目前,我的“.csv”文件数据如下:

AT  V   AP  RH  PE
14.96   41.76   1024.07 73.17   463.26
25.18   62.96   1020.04 59.08   444.37
5.11    39.4    1012.16 92.14   488.56
20.86   57.32   1010.24 76.64   446.48
10.82   37.5    1009.23 96.62   473.9
26.27   59.44   1012.23 58.77   443.67
15.89   43.96   1014.02 75.24   467.35
9.48    44.71   1019.12 66.43   478.42
14.64   45  1021.78 41.25   475.98
.....................................

截至目前,我已将神经网络设计为多输入和多输出。在上面的数据中,我考虑前三列作为我的输入,接下来的两列作为我的输出。所以,一旦我训练数据,如果我通过输入14.64,45,1021.78,我希望我的神经网络预测输出值41.25和475.98。 这是我目前的代码:

import tensorflow as tf
import numpy as np
import pandas as pd
#import matplotlib.pyplot as plt
rng = np.random

# Parameters
learning_rate = 0.01
training_epochs = 5000
display_step = 1000
batch_size = 100

# Read data from CSV

df = pd.read_csv("H:\MiniThessis\Sample.csv")


# In[173]:

# Seperating out dependent & independent variable

train_x = df[['AT','V','AP']]
train_y = df[['RH','PE']]
trainx = train_x.as_matrix().astype(np.float32)
trainy = train_y.as_matrix().astype(np.float32)

n_input = 3
n_classes = 2
n_hidden_1 = 20
n_hidden_2 = 20
n_samples = len(trainx)

# tf Graph Input
#Inserts a placeholder for a tensor that will be always fed.
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])

# Set model weights
W_h1 = tf.Variable(tf.random_normal([n_input, n_hidden_1]))
W_h2 = tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2]))
W_out = tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
b_h1 = tf.Variable(tf.zeros([n_hidden_1]))
b_h2 = tf.Variable(tf.zeros([n_hidden_2]))
b_out = tf.Variable(tf.zeros([n_classes]))


# In[175]:

# Construct a linear model
layer_1 = tf.add(tf.matmul(x, W_h1), b_h1)
layer_1 = tf.nn.relu(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, W_h2), b_h2)
layer_2 = tf.nn.relu(layer_2)
out_layer = tf.matmul(layer_2, W_out) + b_out


# In[176]:

# Mean squared error
#cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_layer, labels=y))
cost = tf.reduce_mean(tf.pow(out_layer-y, 2))/(2*n_samples)
#cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_layer, labels=y))
# Gradient descent
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)


# In[177]:

# Initializing the variables
init = tf.global_variables_initializer()


# In[181]:
initialval = 0
finalval = 100
batchcount = int(n_samples/100)
remainder = n_samples%100
print(remainder)

if remainder!=0:
    batchcount = batchcount +1

# Launch the graph
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        avg_cost = 0.
        for batchIdx in range(batchcount):
            if remainder != 0 and batchIdx==batchcount-1:
                finalval = finalval-(100-remainder)
            subtrainx = trainx[initialval:finalval]
            subtrainy = trainy[initialval:finalval]
            _, c = sess.run([optimizer, cost], feed_dict={x: subtrainx,y: subtrainy})
            initialval = initialval+100
            finalval = finalval+100

            avg_cost += c/batchcount

        # Display logs per epoch step
        if epoch % display_step == 0:
            print("Epoch:", '%04d' % (epoch+1), "cost=", \
                "{:.9f}".format(avg_cost))

    #print("Optimization Finished!")
    #training_cost = sess.run(cost, feed_dict={x: trainx,y: trainy})
    #print(training_cost)

    best = sess.run([out_layer], feed_dict={x: np.array([[14.96,41.76,1024.07]])})
    print(best)

我的神经网络架构如下: 1)输入节点(n_inputs)和输出(n_classes)节点的数量分别为3和2 2)截至目前,我正在考虑两个隐藏层,每个层有20个节点

我需要以下几点提供帮助:

1)如何选择参数“training_epoch”; “learning_rate”; “batch_size”在这里,以便我可以获得更好的准确度?

2)我仍然不确定神经网络的架构。建议使用多少个隐藏层?还有,每个隐藏层中的节点数量?

3)如果假设,在我的数据中,我想使用前两列作为输入,接下来的三列作为输出,那么我可以做出哪些更改?我是否还需要更改完整的架构?

4)另外,我不确定我的成本函数。哪个更好用于更好的准确性?

5)另外,如果我遗漏了一些值得考虑的重要参数,请告诉我!

提前致谢!

1 个答案:

答案 0 :(得分:0)

您提出的问题非常普遍,如果能够找到对这些问题的通用答案,那么数据科学家将不复存在,因为机器学习系统构建过程将会自动化。

1,2,4。学习率和时代数相应地:“越少越好”和“越多越好”。然而,在实践中,你还需要你的机器在宇宙热死之前完成教育。

通常,您会查看错误函数的值,该函数是您在其上训练的数据集上的网络分数。起初,网络正在从数据中学习,每个时代的得分都会变得更好。过了一会儿,网络会从数据集中学到所有可能,并且分数会停止改善。在此之后,没有必要继续下去。如果错误足够小,您也可以提前退出。

学习率也可以根据误差的演变来选择。速率越高,网络完成学习的速度就越快,但如果网络太高,网络可能会超出参数的最佳值,随着时间的推移越来越差。因此,您需要在学习速度和准确性之间找到折衷方案。随着纪元计数器的增加,降低学习率并不罕见。

您还使用了“准确度”一词,但您需要首先根据问题定义它的含义。 (实际上,它与成本函数密切相关。) 您所描述的问题属于线性\非线性回归类(与逻辑回归相反),对于这些问题,均方误差(在代码中使用)是惯用的。那些交叉熵标准通常更适合分类问题。如果您对数据有一些领域专业知识,那么您当然可以为您的网络设计专门的成本函数。

关于网络的最佳结构没有单一的答案。它的复杂性取决于您尝试近似的功能。如果输入和输出数据之间的连接是线性的,那么除了单个神经元之外,您不需要任何其他东西。 通常,决定网络结构的任务本身就是优化问题。因此,您首先将一些测试数据与答案分开,然后在剩余数据上训练您的网络,然后查看它对测试数据的执行情况,这是以前没有见过的。您测试网络,修改它,训练它并再次测试。根据网络在训练和测试集上的表现,您可以决定如何改变它。

3。您需要更改输入和输出的数量。你必须重新训练网络。

此外,互联网上的许多课程都涵盖了这些以及更多基本问题,请考虑采取这些问题。其中一门课程可以找到here