復(fù)現(xiàn)兩篇論文中的時間序列預(yù)測模型

星期二, 08. 十月 2019 03:27下午
注:論文實現(xiàn)代碼和論文.pdf都在git 賬號下,歡迎交流討論

論文題目:

  • Learning to Monitor Machine Health with Convolutional Bi-Directional LSTM Networks
  • Machine health monitoring using local feature-based gated recurrent unit networks

1.第一篇文章基本框架

fig_1.png

論文主要內(nèi)容:通過論文提出的模型實現(xiàn)對故障的診斷(分類回歸都可以實現(xiàn))
論文的框架主要分為四個部分:
1占键、原始數(shù)據(jù)(可以是多個傳感器數(shù)據(jù))通過滑窗提取時頻域特征,假設(shè)傳感器數(shù)目為m贩绕,窗口數(shù)目為k,每個傳感器提取的特征數(shù)目為n,則原始數(shù)據(jù)提過特征提取后的輸入為[-1, k, m*n],其中-1表示batch數(shù)目陶舞。
住:這一部分在框圖和代碼中沒有體現(xiàn)绪励,但是在論文中可以看出來肿孵。如果讀者需要套用這個模型,需要自己實現(xiàn)這一部分的功能疏魏,如果在用原始數(shù)據(jù)輸入(不經(jīng)過特征提韧W觥)也可以取得很好效果,則這一部分可以省略
2大莫、卷積部分實現(xiàn)空間特征提取蛉腌,保留時間信息,代碼如下:

    @staticmethod
    def cnn_layer(cnn_input=None, k=None, m=None, s=None, d=None):
        cnn1 = tf.contrib.layers.conv2d(cnn_input,
                                        num_outputs=k,
                                        kernel_size=[m, d],
                                        stride=[1, d],
                                        padding='VALID', )
        cnn1_pool = tf.nn.max_pool(cnn1,
                                   ksize=[1, s, 1, 1],
                                   strides=[1, s, 1, 1],
                                   padding='SAME',
                                   name='cnn1_max_pool')
        cnn1_shape = cnn1_pool.get_shape()
        cnn_out = tf.reshape(cnn1_pool, shape=[-1, cnn1_shape[1], cnn1_shape[-1]])
        return cnn_out

可以參考圖3結(jié)合代碼的實現(xiàn)理解只厘,注意理解卷積層池化層的kernel_size和ksize眉抬,其中d表示數(shù)據(jù)的長度,即m*n的值:


2.png

3懈凹、兩層雙向LSTM的堆疊蜀变,主要用于在cnn輸出的基礎(chǔ)上提取時間信息,代碼如下:

    @staticmethod
    def bilstm_layer(bilstm_input=None, num_units=None):
        # first bi-lstm cell
        with tf.variable_scope('1st-bi-lstm-layer', reuse=tf.AUTO_REUSE):
            cell_fw_1 = tf.nn.rnn_cell.LSTMCell(num_units=num_units[0], state_is_tuple=True)
            cell_bw_1 = tf.nn.rnn_cell.LSTMCell(num_units=num_units[0], state_is_tuple=True)
            outputs_1, states_1 = tf.nn.bidirectional_dynamic_rnn(cell_fw_1, cell_bw_1, inputs=bilstm_input,
                                                                  dtype=tf.float32)

        # second bi-lstm cell
        with tf.variable_scope('2nd-bi-lstm-layer', reuse=tf.AUTO_REUSE):
            # input_2 = tf.add(outputs_1[0], outputs_1[1])
            input_2 = tf.concat([outputs_1[0], outputs_1[1]], axis=2)
            cell_fw_2 = tf.nn.rnn_cell.LSTMCell(num_units=num_units[1], state_is_tuple=True)
            cell_bw_2 = tf.nn.rnn_cell.LSTMCell(num_units=num_units[1], state_is_tuple=True)
            outputs_2, states_2 = tf.nn.bidirectional_dynamic_rnn(cell_fw_2, cell_bw_2, inputs=input_2,
                                                                  dtype=tf.float32)

        # bilstm output
        with tf.variable_scope('bi-lstm-layer-output', reuse=tf.AUTO_REUSE):
            bilstm_out = tf.concat([states_2[0].h, states_2[1].h], axis=1)
        return bilstm_out

可以參考圖c結(jié)合代碼的實現(xiàn)理解介评,注意理解兩個雙向lstm層的拼接(關(guān)于該部分的實現(xiàn)也是根據(jù)論文原文實現(xiàn)的库北,如果有問題還請討論交流):


3.png

4爬舰、全連接層實現(xiàn)最終結(jié)果輸出,這一部分的實現(xiàn)相對簡單寒瓦,主要對上一層最后在timestep輸出的隱層特征作為輸入得到最終的結(jié)果情屹,代碼如下所示:

    @staticmethod
    def fc_layer(fc_input=None, num_units=None, keep_prob=None):
        fc_input_ = tf.nn.dropout(fc_input, keep_prob=keep_prob)
        fc1 = tf.layers.dense(fc_input_, num_units[0], activation=tf.nn.relu,
                              kernel_initializer=tf.glorot_uniform_initializer())
        fc1_ = tf.nn.dropout(fc1, keep_prob=keep_prob)
        fc_out = tf.layers.dense(fc1_, num_units[1], activation=tf.nn.relu,
                                 kernel_initializer=tf.glorot_uniform_initializer())
        # fc_out = tf.layers.dense(fc_out, 1, activation=None, use_bias=False,
        #                          kernel_initializer=tf.glorot_normal_initializer())
        return fc_out

所有代碼實現(xiàn)請參考本人git.

2.第二篇文章基本框架

4.png

論文主要內(nèi)容:通過論文提出的模型實現(xiàn)對故障的診斷(分類回歸都可以實現(xiàn))
論文的框架主要分為四個部分:
1、原始數(shù)據(jù)(可以是多個傳感器數(shù)據(jù))通過滑窗提取時頻域特征杂腰,假設(shè)傳感器數(shù)目為m垃你,窗口數(shù)目為k,每個傳感器提取的特征數(shù)目為n喂很,則原始數(shù)據(jù)提過特征提取后的輸入為[-1, k, m*n]惜颇,其中-1表示batch數(shù)目。(這與論文1中提到的是一樣的少辣,而且可以從下圖中看出來)凌摄,這一部分的內(nèi)容同樣需要讀者自己實現(xiàn)。
2漓帅、雙向GRU實現(xiàn)時間特征提取锨亏,這一部分也相對簡單,代碼如下:

    @staticmethod
    def bigru_layer(bilstm_input=None, num_units=None):
        cell_fw = tf.nn.rnn_cell.GRUCell(num_units=num_units, name='fw')
        cell_bw = tf.nn.rnn_cell.GRUCell(num_units=num_units, name='bw')
        outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_fw, cell_bw, inputs=bilstm_input, dtype=tf.float32)
        bigru_out = tf.concat([states[0], states[1]], axis=1)
        return bigru_out

3忙干、權(quán)重平均化部分器予,這一部分主要通過fc實現(xiàn),但是需要先對輸入到gru的數(shù)據(jù)進行處理捐迫,參考原文公式和代碼劣摇,由于原文公式較長,該部分只粘貼代碼弓乙,其主要思想是實現(xiàn)不同窗口在同一個time step上做類似指數(shù)的平均末融,參考代碼如下:

    @staticmethod
    def get_weight_average_layer(weight_average_input=None):
        _arr_weight_average_input = np.array(weight_average_input)
        _, T, _ = _arr_weight_average_input.shape
        _arr = []
        for ck in _arr_weight_average_input:    # every batch
            qk = np.array([np.exp(np.min([k - 1, T - k])) for k in range(1, T+1)])
            sigma_qk = np.sum(qk, dtype=np.float32)
            wk = np.array([qj * 1.0 / sigma_qk for qj in qk])
            c = np.array([wk[k]*ck[k] for k in range(T)]).sum(axis=0)
            _arr.append(c)
        return np.array(_arr)

4、這一部分相對簡單暇韧,就是將第2和第3部分的結(jié)果進行concat再通過一個fc學(xué)習(xí)勾习,代碼如下:

    @staticmethod
    def fc_layer_2(fc_input=None, num_units=None, keep_prob=None):
        fc_input_ = tf.nn.dropout(fc_input, keep_prob=keep_prob)
        fc_out = tf.layers.dense(fc_input_, num_units, activation=tf.nn.relu,
                                 kernel_initializer=tf.glorot_uniform_initializer())
        # fc_out = tf.nn.dropout(fc, keep_prob=keep_prob)
        return fc_out

所有代碼實現(xiàn)請參考本人git.

注:

  • 代碼中有任何問題歡迎與本人交流討論;
  • 代碼需要支持tensorflow-gpu(>=1.10.0)才能運行懈玻;
  • git 上有參考論文和部分用于實驗的數(shù)據(jù)巧婶,讀者可以運行main_test文件對模型進行檢驗崔梗;
  • git 中data文件夾下的數(shù)據(jù)是一個回歸問題澜汤,隨著程序的運行mse會在100附近;
  • 代碼中所有參數(shù)的表示都在類中注明了放妈。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湾盒,一起剝皮案震驚了整個濱河市湿右,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罚勾,老刑警劉巖毅人,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吭狡,死亡現(xiàn)場離奇詭異,居然都是意外死亡丈莺,警方通過查閱死者的電腦和手機划煮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缔俄,“玉大人弛秋,你說我怎么就攤上這事±兀” “怎么了蟹略?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞎疼。 經(jīng)常有香客問我,道長壁畸,這世上最難降的妖魔是什么贼急? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捏萍,結(jié)果婚禮上太抓,老公的妹妹穿的比我還像新娘。我一直安慰自己令杈,他們只是感情好走敌,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逗噩,像睡著了一般掉丽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上异雁,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天捶障,我揣著相機與錄音,去河邊找鬼纲刀。 笑死项炼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的示绊。 我是一名探鬼主播锭部,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼面褐!你這毒婦竟也來了拌禾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤展哭,失蹤者是張志新(化名)和其女友劉穎蹋砚,沒想到半個月后扼菠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡坝咐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年循榆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨坚。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡秧饮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泽篮,到底是詐尸還是另有隱情盗尸,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布帽撑,位于F島的核電站泼各,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亏拉。R本人自食惡果不足惜扣蜻,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望及塘。 院中可真熱鬧莽使,春花似錦、人聲如沸笙僚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肋层。三九已至亿笤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栋猖,已是汗流浹背责嚷。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掂铐,地道東北人罕拂。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像全陨,于是被迫代替她去往敵國和親爆班。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容