简体   繁体   English

tfagents sequential.network 中 Conv1d 输入形状的问题

[英]Problem with input shape of Conv1d in tfagents sequential network

I have created a trading environment using tfagent我使用 tfagent 创建了一个交易环境

env = TradingEnv(df=df.head(100000), lkb=1000)
tf_env = tf_py_environment.TFPyEnvironment(env)

and passed a df of 100000 rows from which only closing prices are used which a numpy array of 100000 stock price time series data并传递了 100000 行的 df,其中仅使用收盘价,其中 numpy 数组包含 100000 个股票价格时间序列数据

df: Date Open High Low Close volume
0 2015-02-02 09:15:00+05:30 586.60 589.70 584.85 584.95 171419
1 2015-02-02 09:20:00+05:30 584.95 585.30 581.25 582.30 59338
2 2015-02-02 09:25:00+05:30 582.30 585.05 581.70 581.70 52299
3 2015-02-02 09:30:00+05:30 581.70 583.25 581.70 582.60 44143
4 2015-02-02 09:35:00+05:30 582.75 584.00 582.75 582.90 42731
... ... ... ... ... ... ...
99995 2020-07-06 11:40:00+05:30 106.85 106.90 106.55 106.70 735032
99996 2020-07-06 11:45:00+05:30 106.80 107.30 106.70 107.25 1751810
99997 2020-07-06 11:50:00+05:30 107.30 107.50 107.10 107.35 1608952
99998 2020-07-06 11:55:00+05:30 107.35 107.45 107.10 107.20 959097
99999 2020-07-06 12:00:00+05:30 107.20 107.35 107.10 107.20 865438

at each step the agent has access to previous 1000 prices + current price of stock = 1001在每一步,代理人都可以访问之前的 1000 个价格 + 当前股票价格 = 1001

and it can take 3 possible action from 0,1,2它可以从 0,1,2 采取 3 种可能的行动

then i wrapped it in TFPyEnvironment to convert it to tf_environment然后我将它包装在 TFPyEnvironment 中以将其转换为 tf_environment

the prices that the agent can observe is a 1d numpy array.代理可以观察到的价格是 1d numpy 数组。

prices = [584.95 582.3 581.7... 107.35 107.2 107.2 ]价格 = [584.95 582.3 581.7... 107.35 107.2 107.2 ]

TimeStep Specs时间步规格

TimeStep Specs: TimeStep( {'discount': BoundedTensorSpec(shape=(), dtype=tf.float32,                     
name='discount', minimum=array(0., dtype=float32), maximum=array(1., dtype=float32)), 
'observation': BoundedTensorSpec(shape=(1001,), dtype=tf.float32, name='_observation', 
minimum=array(0., dtype=float32), maximum=array(3.4028235e+38, dtype=float32)), 'reward': 
TensorSpec(shape=(), dtype=tf.float32, name='reward'), 'step_type': TensorSpec(shape=(), 
dtype=tf.int32, name='step_type')}) Action Specs: BoundedTensorSpec(shape=(), dtype=tf.int32, 
name='_action', minimum=array(0, dtype=int32), maximum=array(2, dtype=int32))

then i build a dqn agent but i want to build it with a Conv1d layer然后我构建了一个 dqn 代理,但我想用一个 Conv1d 层来构建它

my.network consist of Conv1D, MaxPool1D, Conv1D, MaxPool1D, Dense_64, Dense_32, q_value_layer my.network 由 Conv1D、MaxPool1D、Conv1D、MaxPool1D、Dense_64、Dense_32、q_value_layer 组成

i created a list layers using tf.keras.layers api and stored it in dense_layers list and created a Sequential Network我使用 tf.keras.layers api 创建了一个列表层并将其存储在 dense_layers 列表中并创建了一个顺序网络

DQN_Agent DQN_代理

`learning_rate = 1e-3
action_tensor_spec = tensor_spec.from_spec(tf_env.action_spec())
num_actions = action_tensor_spec.maximum - action_tensor_spec.minimum + 1

dense_layers = []

dense_layers.append(tf.keras.layers.Conv1D(
64,
kernel_size=(10),
activation=tf.keras.activations.relu,
input_shape=(1,1001),
))

dense_layers.append(
tf.keras.layers.MaxPool1D(
pool_size=2,
strides=None,
padding='valid',
))

dense_layers.append(tf.keras.layers.Conv1D(
64,
kernel_size=(10),
activation=tf.keras.activations.relu,
))

dense_layers.append(
tf.keras.layers.MaxPool1D(
pool_size=2,
strides=None,
padding='valid',
))

dense_layers.append(
tf.keras.layers.Dense(
64,
activation=tf.keras.activations.relu,
))

dense_layers.append(
tf.keras.layers.Dense(
32,
activation=tf.keras.activations.relu,
))

q_values_layer = tf.keras.layers.Dense(
num_actions,
activation=None,
kernel_initializer=tf.keras.initializers.RandomUniform(
minval=-0.03, maxval=0.03),
bias_initializer=tf.keras.initializers.Constant(-0.2))

q_net = sequential.Sequential(dense_layers + [q_values_layer])`

`optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)

train_step_counter = tf.Variable(0)

agent = dqn_agent.DqnAgent(
tf_env.time_step_spec(),
tf_env.action_spec(),
q_network=q_net,
optimizer=optimizer,
td_errors_loss_fn=common.element_wise_squared_loss,
train_step_counter=train_step_counter)    

agent.initialize()`

but when i passed the q.net as a q.network to DqnAgent i came accross this error但是当我将 q.net 作为 q.network 传递给 DqnAgent 时,我遇到了这个错误

`---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in ()
68 optimizer=optimizer,
69 td_errors_loss_fn=common.element_wise_squared_loss,
---> 70 train_step_counter=train_step_counter)
71
72 agent.initialize()

7 frames
/usr/local/lib/python3.7/dist-packages/tf_agents/networks/sequential.py in call(self, inputs,         
network_state, **kwargs)
222 else:
223 # Does not maintain state.
--> 224 inputs = layer(inputs, **layer_kwargs)
225
226 return inputs, tuple(next_network_state)

ValueError: Exception encountered when calling layer "sequential_54" (type Sequential).

Input 0 of layer "conv1d_104" is incompatible with the layer: expected min_ndim=3, found         
ndim=2. Full shape received: (1, 1001)

Call arguments received by layer "sequential_54" (type Sequential):
• inputs=tf.Tensor(shape=(1, 1001), dtype=float32)
• network_state=()
• kwargs={'step_type': 'tf.Tensor(shape=(1,), dtype=int32)', 'training': 'None'}
In call to configurable 'DqnAgent' (<class 'tf_agents.agents.dqn.dqn_agent.DqnAgent'>)`

i know it has something to do with the input shape of first layer of cov1d but cant figure out what am doing wrong我知道这与 cov1d 第一层的输入形状有关,但无法弄清楚哪里做错了

at each time_step the agent is reciveing a observation of prices of 1d array of length 1001 then the input shape of conv1d should be (1,1001) but its wrong and i don't know how to solve this error在每个 time_step 中,agent 都会收到长度为 1001 的 1d 数组的价格观察值,然后 conv1d 的输入形状应该是 (1,1001) 但它是错误的,我不知道如何解决这个错误

need help需要帮忙

Unfortunately, TF-Agents doesn't support Conv1D layers .不幸的是,TF-Agents 不支持Conv1D layers Almost all.network classes use the EncodingNetwork class to build their.networks.几乎所有的.network 类都使用EncodingNetwork class 来构建它们的.networks。 If You check out their github code or documentation, they do provide the Conv1D layer in the EncodingNetwork , however, it is set to Conv2D by default and no.network class has a parameter that sets the conv_type .如果您查看他们的 github 代码或文档,他们确实在EncodingNetwork中提供了Conv1D layer ,但是,它默认设置为Conv2D并且 no.network class 有一个设置conv_type的参数。

However, there is a workaround.但是,有一个解决方法。 Just copy the.network you want to use, and change the line that calls the EncodingNetwork, so that the conv_type is set to 1D .只需复制您要使用的 .network,并更改调用 EncodingNetwork 的行,以便将 conv_type 设置为 1D I had also open a github issue about that here:我还在这里打开了一个 github 问题:

https://github.com/tensorflow/agents/issues/779 https://github.com/tensorflow/agents/issues/779

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM