构建多输出神经网络

时间:2017-08-16 19:35:25

标签: python tensorflow neural-network artificial-intelligence

我的输入数据如下:

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
....................................

我基本上使用Tensorflow库处理Python。     到目前为止,我有一个线性模型,它适用于4输入和1输出。这基本上是一个回归问题。     例如:用足够的数据训练我的神经网络后(比如数据的大小是10000),然后在训练我的神经网络时,如果我传递值45,30,25,32作为输入,则返回值46作为输出。

我基本上有两个问题:

  1. 截至目前,在我的代码中,我正在使用参数 training_epochslearning_rate等我现在正在给予 值training_epochs为10000。所以,当我测试我的神经 通过传递四个输入值的网络,我得到输出为 大约471.25,而我预计它会是460.但如果我给的是 training_epochs的值为20000,而不是10000,我得到了 我的输出值为120.5,与之相比,它完全没有关闭 实际值“460”。
  2. 请您解释一下,如何在我的代码中选择training_epochslearning_rate(或任何其他参数值)的值,以便我可以获得良好的准确性。

    1. 现在,第二个问题是,到目前为止我的神经网络正在发挥作用 仅适用于线性数据,仅适用于1个输出。 如果我想拥有 3输入和2输出以及非线性模型,是什么 我可以在代码中进行哪些更改?
    2. 我在下面发布我的代码:

      import tensorflow as tf
      import numpy as np
      import pandas as pd
      #import matplotlib.pyplot as plt
      rng = np.random
      
      
      # In[180]:
      
      # Parameters
      learning_rate = 0.01
      training_epochs = 10000
      display_step = 1000
      
      
      # In[171]:
      
      # 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','RH']]
      train_y = df[['PE']]
      trainx = train_x.as_matrix().astype(np.float32)
      trainy = train_y.as_matrix().astype(np.float32)
      # In[174]:
      
      n_input = 4
      n_classes = 1
      n_hidden_1 = 5
      n_samples = 9569
      
      # 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_out = tf.Variable(tf.random_normal([n_hidden_1, n_classes]))
      b_h1 = tf.Variable(tf.random_normal([n_hidden_1]))
      b_out = tf.Variable(tf.random_normal([n_classes]))
      
      
      # In[175]:
      
      # Construct a linear model
      layer_1 = tf.matmul(x, W_h1) + b_h1
      layer_1 = tf.nn.relu(layer_1)
      out_layer = tf.matmul(layer_1, W_out) + b_out
      
      
      # In[176]:
      
      # Mean squared error
      cost = tf.reduce_sum(tf.pow(out_layer-y, 2))/(2*n_samples)
      # Gradient descent
      optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
      
      
      # In[177]:
      
      # Initializing the variables
      init = tf.global_variables_initializer()
      
      
      # In[181]:
      
      # Launch the graph
      with tf.Session() as sess:
          sess.run(init)
      
          # Fit all training data
          for epoch in range(training_epochs):
              _, c = sess.run([optimizer, cost], feed_dict={x: trainx,y: trainy})
      
              # Display logs per epoch step
              if (epoch+1) % display_step == 0:
                  print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
      
          print("Optimization Finished!")
          training_cost = sess.run(cost, feed_dict={x: trainx,y: trainy})
          print(training_cost)
      
          correct_prediction = tf.equal(tf.argmax(out_layer, 1), tf.argmax(y, 1))
          best = sess.run([out_layer], feed_dict=
          {x:np.array([[14.96,41.76,1024.07,73.17]])})
          print(correct_prediction)
      
          print(best)
      

1 个答案:

答案 0 :(得分:1)

1.您可以调整以下这些行;

# In general baises are either initialized as zeros or not zero constant, but not Gaussian 
b_h1 = tf.Variable(tf.zeros([n_hidden_1]))
b_out = tf.Variable(tf.zeros([n_classes]))

# MSE error
cost = tf.reduce_mean(tf.pow(out_layer-y, 2))/(2*n_samples)

此外,将数据作为迷你批次提供;正如你正在使用的优化器被调整为miniatch优化;整体提供数据不会带来最佳性能。

2。 对于多个输出,您只需要更改n_classes和成本功能(tf.nn.softmax_cross_entropy_with_logits)。此处定义的模型也不是线性的;因为您正在使用非线性激活函数tf.nn.relu