Tensorflow2自定义网络 1. Tree-LSTM大致介绍与代码实现

Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks

大致介绍

这篇论文提出了Tree-LSTM,把LSTM结果扩展到树状的网络拓扑结构,对于一些NLP任务(或者说 处理具有树型数据结构的数据)提供了特征提取的方法。

简单来说,有两种模型,一种是Child-Sum,一种是N-ray。

个人认为:

  • Child-Sum的缺点是,特征提取会丢失子节点的位置信息(孩子节点的特征向量做加法,并不能确定位置)
  • N-ary的缺点是,孩子节点数量不确定的时候,难以为孩子节点声明一定数量的权重矩阵

本人的一个任务是处理树型结构AST(可以查看我的文章,有关AST处理方法),所以我采用 二叉树 N-ary Tree-LSTM。

环境

tensorflow2 (不是1)

采用自定义layers.Layer类,建立Tree-LSTM单元。如果要使用,可以把定义的类放入Model类的call()做操作(个人没用用Sequential使用过)。

代码

import tensorflow as tf
from tensorflow.keras import *

class MyDense(layers.Layer):
    def __init__(self,input_dim,output_dim,matrices_num=2,activation='sigmoid'):
        super(MyDense, self).__init__()
        self.kernel = self.add_weight('w',[input_dim,output_dim])
        self.bias = self.add_weight('b',[output_dim])
        self.matrices_num = matrices_num
        self.matrices = []
        self.activation = layers.Activation(activation)

        for i in range(matrices_num):
            self.matrices.append(self.add_weight('u'+str(i),[output_dim,output_dim]))

    def call(self, inputs, hiddens=None, **kwargs):
        """
        How to use:
        MyDense(input_dim,output_dim,matrices_num,activation)(inputs, hiddens)

        :param inputs: x's Embedding
        :param hiddens: x's children hidden state
        :param kwargs: None
        :return: [b, emb],[b, child_num, dim] => h:[b, dim]
        """
        out = inputs @ self.kernel
        for i in range(self.matrices_num):
            out += hiddens[...,i,:] @ self.matrices[i]

        out += self.bias
        out = self.activation(out)
        return out

####### test MyDense
# dense = MyDense(10, 4,matrices_num=2,activation='tanh')
# # [b, seq, emb] => [b, seq, dim]
# a = tf.random.normal([4,30,10])
# # [b, seq, num, dim]
# h = tf.random.normal([4,30,2,4])
# print(dense(a, h))
# print(dense.kernel)
# print(dense.bias)

class TreeLSTM(layers.Layer):
    def __init__(self,embed_dim, hidden_dim, child_num=2):
        super(TreeLSTM, self).__init__()
        self.embed_dim = embed_dim
        self.hidden_dim = hidden_dim
        self.child_num = child_num
        self.inputGate = MyDense(embed_dim, hidden_dim,matrices_num=child_num)
        self.forgetGate = []
        for i in range(child_num):
            self.forgetGate.append(MyDense(embed_dim, hidden_dim,matrices_num=child_num))
        self.outputGate = MyDense(embed_dim, hidden_dim,matrices_num=child_num)
        self.updateInfo = MyDense(embed_dim, hidden_dim,matrices_num=child_num,activation='tanh')
        self.activation = layers.Activation('tanh')

    def call(self, inputs, hiddens=None, cells = None, training=None, **kwargs):
        """
        How to use:
        TreeLSTM(embed_dim, hidden_dim, child_num)(inputs, hiddens cells)
        :param inputs: Node's embedding
        :param hiddens: Children's hidden state
        :param cells: Children's cell state
        :param kwargs: None
        :return: [b, embed], [b, child_num, dim], [b, child_num, dim] => h:[b, dim] c:[b,dim]
        """
        c = self.inputGate(inputs, hiddens) * self.updateInfo(inputs, hiddens)

        # hiddens * mask -> forgetgate
        mask = 1 - tf.linalg.band_part(tf.ones([self.child_num, self.child_num], dtype=tf.float32),0,0)
        mask = tf.expand_dims(mask, axis=-1)
        for i in range(self.child_num):
            c += self.forgetGate[i](inputs, hiddens * mask[i]) * cells[...,i,:]

        h = self.outputGate(inputs, hiddens) * self.activation(c)
        return h, c

######## test TreeLSTM
# treelstm = TreeLSTM(10, 4)
# # x [b, 10]
# x = tf.random.normal([5, 10])
# # h [b, 2, 4]
# h = tf.random.normal([5,2,4])
# # c [b, 2, 4]
# c = tf.random.normal([5,2,4])
# print(treelstm(x,h,c))

实现公式 N-ary Tree-LSTM如下: N-ary

MyDense 类:9~12基本公式实现
Tree-LSTM类:所有公式的集合

使用时,如果对孩子数量有要求,修改child_sum即可

有疑问,或者有问题,欢迎留言

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
1. ARIMA 2. SARIMA 3. VAR 4. Auto-ARIMA 5. Auto-SARIMA 6. LSTM 7. GRU 8. RNN 9. CNN 10. MLP 11. DNN 12. MLP-LSTM 13. MLP-GRU 14. MLP-RNN 15. MLP-CNN 16. LSTM-ARIMA 17. LSTM-MLP 18. LSTM-CNN 19. GRU-ARIMA 20. GRU-MLP 21. GRU-CNN 22. RNN-ARIMA 23. RNN-MLP 24. RNN-CNN 25. CNN-ARIMA 26. CNN-MLP 27. CNN-LSTM 28. CNN-GRU 29. ARIMA-SVM 30. SARIMA-SVM 31. VAR-SVM 32. Auto-ARIMA-SVM 33. Auto-SARIMA-SVM 34. LSTM-SVM 35. GRU-SVM 36. RNN-SVM 37. CNN-SVM 38. MLP-SVM 39. LSTM-ARIMA-SVM 40. LSTM-MLP-SVM 41. LSTM-CNN-SVM 42. GRU-ARIMA-SVM 43. GRU-MLP-SVM 44. GRU-CNN-SVM 45. RNN-ARIMA-SVM 46. RNN-MLP-SVM 47. RNN-CNN-SVM 48. CNN-ARIMA-SVM 49. CNN-MLP-SVM 50. CNN-LSTM-SVM 51. CNN-GRU-SVM 52. ARIMA-RF 53. SARIMA-RF 54. VAR-RF 55. Auto-ARIMA-RF 56. Auto-SARIMA-RF 57. LSTM-RF 58. GRU-RF 59. RNN-RF 60. CNN-RF 61. MLP-RF 62. LSTM-ARIMA-RF 63. LSTM-MLP-RF 64. LSTM-CNN-RF 65. GRU-ARIMA-RF 66. GRU-MLP-RF 67. GRU-CNN-RF 68. RNN-ARIMA-RF 69. RNN-MLP-RF 70. RNN-CNN-RF 71. CNN-ARIMA-RF 72. CNN-MLP-RF 73. CNN-LSTM-RF 74. CNN-GRU-RF 75. ARIMA-XGBoost 76. SARIMA-XGBoost 77. VAR-XGBoost 78. Auto-ARIMA-XGBoost 79. Auto-SARIMA-XGBoost 80. LSTM-XGBoost 81. GRU-XGBoost 82. RNN-XGBoost 83. CNN-XGBoost 84. MLP-XGBoost 85. LSTM-ARIMA-XGBoost 86. LSTM-MLP-XGBoost 87. LSTM-CNN-XGBoost 88. GRU-ARIMA-XGBoost 89. GRU-MLP-XGBoost 90. GRU-CNN-XGBoost 91. RNN-ARIMA-XGBoost 92. RNN-MLP-XGBoost 93. RNN-CNN-XGBoost 94. CNN-ARIMA-XGBoost 95. CNN-MLP-XGBoost 96. CNN-LSTM-XGBoost 97. CNN-GRU-XGBoost 98. ARIMA-ANN 99. SARIMA-ANN 100. VAR-ANN 上面这些缩写模型的全称及相关用途功能详细解释
07-15
以下是对缩写模型的全称及相关用途功能的详细解释: 1. ARIMA (AutoRegressive Integrated Moving Average): 适用于平稳时间序列数据的预测,结合了自回归 (AR) 和移动平均 (MA) 的模型。 2. SARIMA (Seasonal ARIMA): 在ARIMA模型基础上添加了对季节性因素的建模,适用于带有季节性的时间序列数据的预测。 3. VAR (Vector Autoregression): 用于多变量时间序列数据的预测,基于自回归模型,能够捕捉变量之间的相互依赖关系。 4. Auto-ARIMA: 自动选择ARIMA模型的参数,通过对多个模型进行评估和选择来实现自动化。 5. Auto-SARIMA: 自动选择SARIMA模型的参数,通过对多个模型进行评估和选择来实现自动化。 6. LSTM (Long Short-Term Memory): 长短期记忆网络,一种适用于处理长期依赖关系的循环神经网络,用于时间序列数据的建模和预测。 7. GRU (Gated Recurrent Unit): 一种类似于LSTM的循环神经网络,具有更简化的结构,适用于时间序列数据的建模和预测。 8. RNN (Recurrent Neural Network): 适用于处理序列数据的神经网络模型,能够捕捉时间序列的动态特性。 9. CNN (Convolutional Neural Network): 卷积神经网络,主要用于图像处理,但也可以用于时间序列数据的预测,特别擅长局部模式的识别。 10. MLP (Multi-Layer Perceptron): 多层感知机,一种前馈神经网络模型,适用于处理非线性关系的时间序列数据。 11. DNN (Deep Neural Network): 深度神经网络,具有多个隐藏层的神经网络模型,能够学习更复杂的特征表示。 12. MLP-LSTM: 结合了多层感知机和长短期记忆网络的模型,用于时间序列数据的建模和预测。 13. MLP-GRU: 结合了多层感知机和门控循环单元网络的模型,用于时间序列数据的建模和预测。 14. MLP-RNN: 结合了多层感知机和循环神经网络的模型,用于时间序列数据的建模和预测。 15. MLP-CNN: 结合了多层感知机和卷积神经网络的模型,用于时间序列数据的建模和预测。 这些模型可以根据具体问题和数据的特性来选择和使用,以获得最佳的时间序列预测性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值