gpt4 book ai didi

python - 在 Tensorflow 中运行 RNN

转载 作者:行者123 更新时间:2023-11-30 09:17:31 24 4
gpt4 key购买 nike

如果我有一个包含 20 个 float 类型元素的数组。
根据前十个元素的值,我想要一个 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)

我提供给提要字典的“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)

最佳答案

首先,查看 Keras - 它是一个使用 TensorFlow 作为后端的模块,但将最重要的神经网络位包装在非常易于使用的对象中。 RNN 文档可以找到 here .

所以我从这个问题中了解到的是,你有一个数字序列,并且你想使用之前的数字来预测 future 的数字。如果您拥有的每个数据点代表该序列中的一个时间步,您可以采用我认为的两种方法之一。这取决于您想要建模的内容。请阅读this article这可以让您更好地理解 LSTM 网络,然后回到这里。这两种方式是:

1。多对一的数据关系

如果您的数据只是一系列相继的步骤,您可以将每个时间步定义为前一个时间步的输出。这意味着在 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 次 ] 你的输出数组将是[[0.5]、[0.5]、[0.5] ... 20 次]

通过这样做,您的神经网络将一次输入 1 个步骤,并使用所有先前的步骤来预测下一个步骤。例如,如果您想预测 20 个序列中的第 11 个步骤,您的神经网络将使用之前的 10 个步骤来执行此操作。您可以将其视为 t[0-10] => t[11]

2。多对多关系

如果您确实需要保留您在问题中描述的关系 - 前 10 个步骤预测其余 10 个 - 您需要使用多对多关系。 Karpathy 的文章涉及这个主题,所以请看一下。老实说,我对这种情况没有太多经验,所以我唯一能指出的是你需要使用 Keras' TimeDistributed Dense layer为了对此进行建模。

我希望这有帮助。祝你好运!

关于python - 在 Tensorflow 中运行 RNN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com