首页 文章

为回归数据设计高效的神经网络[关闭]

提问于
浏览
0

通过关于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)

The architecture of my neural network is as follows: 1)输入节点数(n_inputs)和输出(n_classes)节点分别为3和2 2)截至目前,我正在考虑两个隐藏层,每个层有20个节点

I need help regarding in following points:

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

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

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

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

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

提前致谢!

1 回答

  • 0

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

    1,2,4. 学习率和纪元数相应地为:"the less the better"和"the more the better" . 然而,在实践中,你还需要你的机器在宇宙热死之前完成教育 .

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

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

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

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

    3. 您需要更改输入和输出的数量 . 你将不得不重新培训网络 .

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

相关问题