另一个“ ValueError:无法为张量为'(?,30)'的张量'占位符:0'输入形状(30,5)的值“”

时间:2019-09-07 21:51:05

标签: python python-3.x tensorflow

请客气,我是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_sizewindow_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,每列代表这些功能。然后应该在迭代中进行训练。

我在以下链接中找到了类似的问题/答案,以帮助比我更了解此事的人。他们中的大多数人都在谈论如何在占位符上重塑数据,我以为我已经尝试过了,但是现在我已经超出了我的知识范围。预先感谢。

Here

Here

Here

Here

更新

男孩,我肯定会努力地自己解决这个问题,但是到目前为止,我还是很感激我的指导,我想我已经接近了,我对改变的知识很有限。给定下面的答案,我知道我的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书中添加了一些额外的注释)。非常感谢。

1 个答案:

答案 0 :(得分:0)

您已将“ self.X”用作第一层的输入,因为模型的行数(数据点)可以变化,但是在训练和预测过程中要素的数量应该相同,因为这决定了该层上神经元的数量。

但是您可以对具有不同功能的数据重用代码,以创建不同的模型,但是对于模型,它必须保持相同。

df["balance"] = np.where(df.index == 0, 100, df["balance"].shift(1) + 1)

开始训练时,您必须知道输入的特征大小,以后不能更改。如果要跟踪其他事物,则需要为此创建其他变量,或者可以在创建张量流图之前进行数据预处理以了解特征编号