• 终于理解清楚attention,利用attention对黄金价格进行预测


    其实说到底,就是四个字,加权求和!!!

    是的,看了将近上百篇文章后,终于搞清楚了一丢丢。

    #基本思想
    inputs = Input(shape=(input_dim,))
    
    #  STARTS HERE
    
    attention_probs = Dense(input_dim, activation='softmax', name='attention_vec')(inputs)
    attention_mul = Multiply()([inputs, attention_probs])
    
    # FINISHES HERE
    
    attention_mul = Dense(64)(attention_mul)
    output = Dense(1, activation='sigmoid')(attention_mul)
    model = Model(input=[inputs], output=output)

    https://www.cnblogs.com/LittleHann/p/9722779.html#_label3_1_1_1

    上面这篇博客成了最后跑通的关键,不得不吐槽现在基本都是抄来抄去,网上很多改动的都不给注解或者把原来的注解还放在上面,真的让我很无语。

    结合https://www.joinquant.com/view/community/detail/301c73f3088d6d768a499d3f519f00e8?type=1&page=1这篇来讲一下最后应该怎么样跑通这一份代码

    除去数据准备和博主相同,接下来主要是模型构建部分

    # 卷积层
    inputs = Input(shape=(TIME_STEPS, INPUT_DIM)) x = Conv1D(filters = 64, kernel_size = 1, activation = 'relu')(inputs) x = MaxPooling1D(pool_size = 5)(x) x = Dropout(0.2)(x)
    from keras.layers import Input, Dense, merge
    from keras import layers
    # 循环层
    lstm_out = Bidirectional(LSTM(lstm_units,return_sequences=True,activation='relu'), name='bilstm')(x)
    print('双向',lstm_out.shape)
    lstm_out = LSTM(lstm_units,activation='relu')(x)
    print('单向',lstm_out.shape)
    

    # 这里便是attention的地方了,注意还是四个字⚠️加权求和,我这里关注的是最后一层单向的LSTM的数据。 attention_probs
    = Dense(64, activation='softmax', name='attention_vec')(lstm_out)这里的64是要关注的那一层的维度,也就是这行代码最后一个小括号里面那个输入层的维度
    # 上面是求了权重
    print(lstm_out.shape) print('权重',attention_probs.shape)
    # 下面将求到的权重和lstm层加权一次 attention_mul
    = Multiply()([lstm_out, attention_probs])

    #这里最后把加和求权的拿出来放到层里面放到一个全联接层里面 attention_mul
    = Dense(64)(attention_mul) output = Dense(1, activation='sigmoid')(attention_mul)
    # 输出层,组成模型
    model = Model(inputs=inputs, outputs=output)
    # print(model.summary())
    # 模型编译
    
    epochs = 10
    
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, shuffle=False)
    y_pred = model.predict(X_test)
    print('MSE Train loss:', model.evaluate(X_train, y_train, batch_size=batch_size))
    print('MSE Test loss:', model.evaluate(X_test, y_test, batch_size=batch_size))
    plt.plot(y_test, label='test')
    plt.plot(y_pred, label='pred')
    plt.legend()
    plt.show()

    关于博客中GRU的那个部分和红色注解这些好像是不用运行的,那个属于额外自定义一种attention机制了,类似于两个LSTM神经元里面又加了一层GRU

    但是,事实上,这一篇博客可能还是有一点问题,比如他对于归一化的处理

    如果你在代码或原理上还有疑惑,欢迎留言。

    但是放在最后,如果不是seqence to sequence,也可以尝试着对于时间序列单纯的本身直接进行运算。请参照下文。

    https://zhuanlan.zhihu.com/p/46148045

  • 相关阅读:
    算法探究-2.retinaNet(Focal Loss)
    C++基础-枚举体 enum class
    C++基础-TypeTraits(进行类型的属性判断) 1.is_lvalue_reference(左值引用判断) 2.is_integral(整形判断) 3.is_class(基本类型判段) 4.is_same(判断类型一致) 5.enable_if(条件判断)
    C++基础-auto(自动分配属性)和decltype(指定分配属性)
    C++基础-正则实战(日期拆分regex_match ,符号拆分sregex_token_iterator, 邮箱的查找 regex_search)
    C++基础-正则表达式 regex_match(匹配) regex_search(查找) regex_replace(替换)
    Shell 入门(三):sed,awk,grep
    Shell 入门(二):数组与函数
    Shell 入门(一):变量和流程控制
    ArcSDE 版本差异提取
  • 原文地址:https://www.cnblogs.com/xingnie/p/12668251.html
Copyright © 2020-2023  润新知