簡體   English   中英

tfagents sequential.network 中 Conv1d 輸入形狀的問題

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

我使用 tfagent 創建了一個交易環境

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

並傳遞了 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

在每一步,代理人都可以訪問之前的 1000 個價格 + 當前股票價格 = 1001

它可以從 0,1,2 采取 3 種可能的行動

然后我將它包裝在 TFPyEnvironment 中以將其轉換為 tf_environment

代理可以觀察到的價格是 1d numpy 數組。

價格 = [584.95 582.3 581.7... 107.35 107.2 107.2 ]

時間步規格

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))

然后我構建了一個 dqn 代理,但我想用一個 Conv1d 層來構建它

my.network 由 Conv1D、MaxPool1D、Conv1D、MaxPool1D、Dense_64、Dense_32、q_value_layer 組成

我使用 tf.keras.layers api 創建了一個列表層並將其存儲在 dense_layers 列表中並創建了一個順序網絡

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()`

但是當我將 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'>)`

我知道這與 cov1d 第一層的輸入形狀有關,但無法弄清楚哪里做錯了

在每個 time_step 中,agent 都會收到長度為 1001 的 1d 數組的價格觀察值,然后 conv1d 的輸入形狀應該是 (1,1001) 但它是錯誤的,我不知道如何解決這個錯誤

需要幫忙

不幸的是,TF-Agents 不支持Conv1D layers 幾乎所有的.network 類都使用EncodingNetwork class 來構建它們的.networks。 如果您查看他們的 github 代碼或文檔,他們確實在EncodingNetwork中提供了Conv1D layer ,但是,它默認設置為Conv2D並且 no.network class 有一個設置conv_type的參數。

但是,有一個解決方法。 只需復制您要使用的 .network,並更改調用 EncodingNetwork 的行,以便將 conv_type 設置為 1D 我還在這里打開了一個 github 問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM