如果我有一个包含20个浮点类型元素的数组。
基于前十个元素的值,我希望RNN能够预测后十个元素的值。通过使用各种在线资源和书籍,我已经构建了一个RNN,它可以读取并处理前十个元素。然而,我不知道如何让它将后十个元素用作“答案键”并据此进行训练。
# To support both python 2 and python 3from __future__ import division, print_function, unicode_literals# Common importsimport numpy as npimport osimport tensorflow as tfimport numpy as npimport pymysql as pym# to make this notebook's output stable across runsdef 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 arraydata_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 = 1n_inputs = 10n_neurons = 10reset_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_dict的数据”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的步骤中,如下所示:steps = data_np[0:,2:12]
我成功地获取了前十个数字,但如何获取后十个数字并输入以训练网络呢?我假设代码的结尾应该看起来像下面这样,其中y
占位符持有RNN的“答案键”。然而,我无法将它们整合在一起。
n_steps = 1n_inputs = 10n_neurons = 10n_outputs = 10learning_rate = 0.001reset_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)
回答:
首先,看看Keras – 它是一个使用TensorFlow作为后端的模块,但用非常易用的对象包装了最重要的神经网络部分。RNN的文档可以在这里找到这里。
从你的问题中我理解到,你有一组数字,你想用之前的数字来预测未来的数字。如果你拥有的每个数据点代表该序列中的一个时间步,我认为你可以采取两种方式之一。这取决于你试图建模的内容。阅读这篇文章,它能更好地理解LSTM网络,然后再回到这里。这两种方式是:
1. 多对一数据关系
如果你的数据只是一个接一个的步骤序列,你可以定义每个时间步为前一个时间步的输出。这意味着在t[0]时,预期输出是t1。要建模这一点,你需要将数据放入具有以下形状的numpy数组中:
输入形状:(样本数量,时间步数,输入数据)例如,(1, 1, 1)表示你有1个样本,1个步骤和1个特征维度输出形状:(样本数量,输出数据)例如,(1, 1)表示你有1个样本,1个输出维度
直接翻译到你的例子中:
形状可能类似于这样:(20, 1, 1),其中你有20个样本,每个样本有1个步骤和1个特征维度。然后你的numpy数组输入看起来像[ [[0.5]], [[0.5]], [[0.5]] ... 20次 ]
,你的输出数组将是[[0.5], [0.5], [0.5] ... 20次]
通过这种方式,你的神经网络将一次输入一个步骤,并使用所有前面的步骤来预测下一个步骤。例如,如果你想预测20个序列中的第11个步骤,你的神经网络将使用前10个步骤来做到这一点。你可以将其视为t[0-10] => t[11]
2. 多对多关系
如果你真的需要保留你在问题中描述的关系 – 前10个步骤预测剩下的10个 – 你需要使用多对多关系。Karpathy的文章触及了这个话题,所以看看那里。说实话,我对这种情况没有太多经验,所以我只能指出你需要使用Keras的TimeDistributed Dense层来建模这一点。
希望这对你有帮助。祝你好运!