如果我有一个由20个float类型的元素组成的数组。
基于前十个元素的值,我希望RNN可以预测后十个元素的值。使用各种在线资源和书籍,我得到了一个RNN,该RNN可以读取并处理前10个元素。但是我不知道如何使用后十个元素作为“答案”并以此为基础进行训练。
# To support both python 2 and python 3
from __future__ import division, print_function, unicode_literals
# Common imports
import numpy as np
import os
import tensorflow as tf
import numpy as np
import pymysql as pym
# to make this notebook's output stable across runs
def reset_graph(seed=42):
tf.reset_default_graph()
tf.set_random_seed(seed)
np.random.seed(seed)
conn = pym.connect("host.docker.internal","root","","DynaSystems" )
cursor = conn.cursor()
cursor.execute("USE DynaSystems")
cursor.execute("SELECT * FROM simulation")
D = []
for row in cursor:
D.append(np.fromiter(row, dtype=float, count=-1))
#print(D)
cursor.close()
conn.close()
#get data into a np array
data_np = np.asarray(D, np.float32)
steps = data_np[0:,2:12]
steps = steps.tolist()
a = []
for x in steps:
c = []
c.append(x)
a.append(c)
#get evars out of simulation data
#print(a)
#Rough draft running a Dynamic unrolling and a Basic RNN Cell.
#It works but there's not training and thus no learning happening yet...
n_steps = 1
n_inputs = 10
n_neurons = 10
reset_graph()
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
outputs_val = outputs.eval(feed_dict={X: a})
print(outputs_val)
我要向Feed字典提供的“ a”中的数据如下所示:
[[[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]], [[0.800000011920929, 0.5, 0.800000011920929, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]]]
在我像这样对data_np进行切片的步骤中: 步骤= data_np [0:,2:12]
我成功地获得了前十个数字,但是如何获取后十个数字并将其输入以便训练网络呢?我假设我的代码结尾需要看起来像下面的样子,其中y
占位符保留RNN的“答案键”。但是,我无法将其组合在一起。
n_steps = 1
n_inputs = 10
n_neurons = 10
n_outputs = 10
learning_rate = 0.001
reset_graph()
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.int32, [None])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
logits = tf.layers.dense(states, n_outputs)
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
loss = tf.reduce_mean(xentropy)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(loss)
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
outputs_val = outputs.eval(feed_dict={X: a})
print(outputs_val)
答案 0 :(得分:0)
首先,看看Keras-这是一个使用TensorFlow作为后端的模块,但是将最重要的神经网络位包装在非常易于使用的对象中。可以在here中找到RNN文档。
所以我从这个问题中了解到,您有一个数字序列,并且希望使用先前的数字来预测将来的数字。如果您拥有的每个数据点都代表该序列中的时间步长,那么您可以采用我认为的两种方式之一。这取决于您要建模的内容。阅读this article,可以更好地理解LSTM网络,然后再回到这里。两种方式是:
如果数据只是一个接一个的步骤序列,则可以将每个时间步定义为先前时间步的输出。这意味着在t [0]处的预期输出为t 1。要放入模型,您需要将数据放入具有以下形状的numpy数组中:
input shape: (number of samples, number of time steps, input data)
i.e. (1, 1, 1) would mean you have 1 sample with 1 step and 1 feature dimension
output shape: (number of samples, output data)
i.e. (1, 1) would mean you have 1 sample with 1 output dimension
并将其直接翻译为您的示例:
形状可能是这样的:
(20,1,1),其中您有20个样本,每个样本具有1个步骤和1个特征维。然后输入你的numpy数组看起来像
[ [[0.5]], [[0.5]], [[0.5]] ... 20 times ]
和您的输出数组将是
[[0.5], [0.5], [0.5] ... 20 times]
这样做,您的神经网络将一次输入1个输入步骤,并使用所有先前的步骤来预测下一个步骤。例如,如果您要预测20序列中的第11步,则您的神经网络将使用前10步来预测。您可以认为这是t[0-10] => t[11]
如果您确实需要保留问题中描述的关系-前10个步骤可预测剩余的10个关系-您需要使用多对多关系。 Karpathy的文章涉及此主题,因此请在那里看看。老实说,我对这种情况没有太多经验,所以我唯一要指出的就是,您需要使用Keras的TimeDistributed Dense layer来对此建模。
我希望这会有所帮助。祝你好运!