请客气,我是TensorFlow的新手。我找到了一个训练政策梯度代理交易股票市场的项目,该项目仅接受每日收盘价的训练。我也很想让它在 Open,High,Low和Volume 功能上进行训练,因此我试图将它们添加到现有代码中。我已经删除了大部分项目,只剩下诊断所需的内容。
您可以找到我的Colab notebook here。而且,我已尽我所能对每个部分进行评论,以使其更易于浏览以及我认为问题在哪里,但我需要有人向我展示位置和原因。
我当前收到错误消息:
ValueError: Cannot feed value of shape (30, 5) for Tensor 'Placeholder:0', which has shape '(?, 30)'
...这很有意义,因为self.X = tf.compat.v1.placeholder(tf.float32, (None, self.state_size))
是为唯一功能(“关闭”)设计的,但是我也尝试将其他功能添加到状态中。 state_size
是window_size
的{{1}}(在训练过程中回溯30行)。而且我正在尝试更改状态以包括添加的功能。因此,我尝试将占位符更改为30
,但随后出现错误:
self.state_size,5
...我还不太清楚,但是我不认为这是问题所在。我知道我正在尝试以一种不期望的形状来输入张量数据,但是我不知道如何自行调整它。 (我认为)我想做的是将这些额外的功能添加到ValueError: Cannot feed value of shape (35760, 5) for Tensor 'Placeholder:0', which has shape '(30, 5)'
函数中,以便每行是1 window_size,每列代表这些功能。然后应该在迭代中进行训练。
我在以下链接中找到了类似的问题/答案,以帮助比我更了解此事的人。他们中的大多数人都在谈论如何在占位符上重塑数据,我以为我已经尝试过了,但是现在我已经超出了我的知识范围。预先感谢。
更新
男孩,我肯定会努力地自己解决这个问题,但是到目前为止,我还是很感激我的指导,我想我已经接近了,我对改变的知识很有限。给定下面的答案,我知道我的window_size /行数可以根据window_size / lookback值的不同而变化,因此这将是占位符的None部分,在这种情况下,我将知道功能(在本例中为5)提前设置为静态数(5)就足够了。因此,我尝试为要添加的每个新功能都没有单独的占位符。
因此,现在尝试使用新的占位符get_state
是:
self.X = tf.compat.v1.placeholder(tf.float32, (None,5))
......所以我得到了 InvalidArgumentError: Incompatible shapes: [3270,3] vs. [98100,3]
[[{{node sub}}]]
During handling of the above exception, another exception occurred:
InvalidArgumentError Traceback (most recent call last)
<ipython-input-4-78f4afe280e1> in <module>()
22 skip = skip)
23
---> 24 agent.train(iterations = 500, checkpoint = 10, initial_money = initial_money)
<ipython-input-3-1788840ff10e> in train(self, iterations, checkpoint, initial_money)
135 cost, _ = self.sess.run([self.cost, self.optimizer], feed_dict={self.X:np.vstack(ep_history[:,0]),
136 self.REWARDS:ep_history[:,2],
--> 137 self.ACTIONS:ep_history[:,1]})
138
139
数组的打印输出以检查其形状,其起始形状为:
ep_history
...用作状态(5列要素和30行window_size),操作(0),starting_money(10,000)和next_state(再次5 x 30,数据集的下一个/将来行)
那么现在看来是什么问题?是数组吗?对于冗长的代码,我深表歉意,但我想为那些对我有帮助的人做透彻的尝试,并表明我实际上是在试图了解该修复程序背后的逻辑,以便以后应用。还有其他意见吗?与array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
...
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]) # which is the current state (5x30)
0 10000 # which is the action and reward/starting_money
array([[ 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00,
0.000000e+00],
[ 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00,
0.000000e+00],
....
[ 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00,
0.000000e+00],
[ 6.000060e-01, 1.669999e+00, 4.899980e-01, 2.309998e+00,
-2.135710e+07]])] # which is the NEXT state
函数有关吗? (在完成此工作时,我已经在colab书中添加了一些额外的注释)。非常感谢。
答案 0 :(得分:0)
您已将“ self.X”用作第一层的输入,因为模型的行数(数据点)可以变化,但是在训练和预测过程中要素的数量应该相同,因为这决定了该层上神经元的数量。
但是您可以对具有不同功能的数据重用代码,以创建不同的模型,但是对于模型,它必须保持相同。
df["balance"] = np.where(df.index == 0, 100, df["balance"].shift(1) + 1)
开始训练时,您必须知道输入的特征大小,以后不能更改。如果要跟踪其他事物,则需要为此创建其他变量,或者可以在创建张量流图之前进行数据预处理以了解特征编号