【问题标题】:构建用于股票预测的快速 GRU 模型
【发布时间】:2021-12-28 06:01:48
【问题描述】:

我是RNNs 的初学者,想为股票预测构建一个运行模型门控循环单元GRU

我有一个用于这种形状的训练数据的 numpy 数组:

train_x.shape
(1122,20,320)
`1122` represents the total amount timestamps I have
`20` is the amount of timestamps I want to predict the future from
`320` is the number of features (different stocks)

我的train_y.shape 是 (1122,) 并表示带有 10 的二进制变量。 1 是买入 0 是卖出。

考虑到这一点,我开始尝试我的GRU 模型:

 def GRU_model(train_x,train_y,test_x,test_y):

    model = Sequential()
    model.add(layers.Embedding(train_x.shape[0],50,input_length=320))
    model.add(layers.GRU(50, return_sequences=True,input_shape=(train_x.shape[1],1),activation='tanh'))
    model.add(layers.GRU(50, return_sequences=True,input_shape=(train_x.shape[1],1),activation='tanh'))
    model.add(layers.GRU(50, return_sequences=True,input_shape=(train_x.shape[1],1),activation='tanh'))
    model.add(layers.GRU(50,activation='tanh'))
    model.add(Dense(units=2))
    model.compile(optimizer=SGD(lr=0.01,decay=1e-7,momentum=0.9,nesterov=False),loss='mean_squared_error')
    
    model.fit(train_x,train_y,epochs=EPOCHS,batch_size=BATCH_SIZE)

    GRU_predict = model.predict(validation_x)

    return model,GRU_predict



my_gru_model,my_gru_predict = GRU_model(train_x,train_y,validation_x,validation_y)
ValueError: Input 0 of layer gru_42 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: (None, 20, 320, 50)

显然我输入模型的尺寸不正确,但我不明白它们应该如何适应,这样模型才能顺利运行。

【问题讨论】:

    标签: python tensorflow keras recurrent-neural-network gated-recurrent-unit


    【解决方案1】:

    因此,如果您有 1122 个数据样本,每个样本有 20 个时间步,每个时间步有 320 个特征,并且您想教您的模型在买卖之间做出二元决策,请尝试以下操作:

    import tensorflow as tf
    tf.random.set_seed(1)
    
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.GRU(50, return_sequences=True, input_shape=(20, 320), activation='tanh'))
    model.add(tf.keras.layers.GRU(50,activation='tanh'))
    model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
    
    model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01,decay=1e-7,momentum=0.9,nesterov=False),loss='binary_crossentropy')
    print(model.summary())
    
    train_x = tf.random.normal((1122, 20, 320))
    train_y = tf.random.uniform((1122,), maxval=2, dtype=tf.int32)
    model.fit(train_x, train_y, epochs=5, batch_size=16)
    
    Model: "sequential"
    _________________________________________________________________
     Layer (type)                Output Shape              Param #   
    =================================================================
     gru (GRU)                   (None, 20, 50)            55800     
                                                                     
     gru_1 (GRU)                 (None, 50)                15300     
                                                                     
     dense (Dense)               (None, 1)                 51        
                                                                     
    =================================================================
    Total params: 71,151
    Trainable params: 71,151
    Non-trainable params: 0
    _________________________________________________________________
    None
    Epoch 1/5
    71/71 [==============================] - 5s 21ms/step - loss: 0.7050
    Epoch 2/5
    71/71 [==============================] - 2s 22ms/step - loss: 0.6473
    Epoch 3/5
    71/71 [==============================] - 1s 21ms/step - loss: 0.5513
    Epoch 4/5
    71/71 [==============================] - 1s 21ms/step - loss: 0.3640
    Epoch 5/5
    71/71 [==============================] - 1s 20ms/step - loss: 0.1258
    <keras.callbacks.History at 0x7f4eac87e610>
    

    请注意,您只有一个输出节点,因为您的模型应该做出二元决策。这也是你必须使用损失函数binary_crossentropy的原因。

    关于 GRU 层,它需要一个形状为 (batch_size, timesteps, features) 的输入,但在训练期间会推断出 batch_size,因此在 input_shape 中被省略。由于下一个 GRU 也需要此形状,因此您在第一个 GRU 中使用参数return_sequences=True,它返回一个形状为(batch_size, 20, 50) => 一个隐藏状态输出50 的序列,用于每个输入时间步n。此外,在您的情况下,您不需要 Embedding 层。它通常用于将表示文本的整数序列映射为n维向量表示。

    【讨论】:

    • 是的,行得通,你能解释一下这行吗model.add(tf.keras.layers.GRU(50, return_sequences=True, input_shape=(20, 320), activation='tanh'))谢谢
    • 我尝试使用Embedding,但它不起作用,很可能我弄错了。 :)
    • 更新了答案,底部有解释。
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2020-08-26
    • 2014-11-29
    • 2020-08-07
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多