tensorflow 雙向LSTM搭建

單向LSTM搭建的步驟是一樣的:

  1. 設(shè)定超參數(shù)(隱藏向量的維度回挽,學(xué)習(xí)率猾普,輸入輸出維度等)
  2. 定義輸入輸出placeholder
  3. 定義網(wǎng)絡(luò)結(jié)構(gòu)皮获,寫好網(wǎng)絡(luò)計算語句(dynamic_run等乓梨,用于計算時生成LSTM單元的輸出狀態(tài))
  4. 定義全連接層的權(quán)重和偏差牲剃,用于將LSTM單元狀態(tài)的輸出轉(zhuǎn)換成類別未規(guī)范化概率
  5. 計算輸出的未規(guī)范化概率
  6. 定義softmax層
  7. 定義損失
  8. 定義訓(xùn)練優(yōu)化器和優(yōu)化操作
  9. sess.run()

下面給出代碼:

learning_rate = 0.1
state_size = 128 # hidden layer num of features
n_classes = 19
n_features = 23

#輸入
x = tf.placeholder(tf.float32, [None, None, n_features], name='input_placeholder')  #batch_size, time_step, feat_len
y = tf.placeholder(tf.float32, [None, None, n_classes], name='labels_placeholder')  #batch_size, time_step, n_classes

batch_size = tf.placeholder(tf.int32, (), name='batch_size')
time_steps = tf.placeholder(tf.int32, (), name='times_step')

#雙向rnn
lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(state_size)
lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(state_size)

init_fw = lstm_fw_cell.zero_state(batch_size, dtype=tf.float32)
init_bw = lstm_bw_cell.zero_state(batch_size, dtype=tf.float32)

weights = tf.get_variable("weights", [2 * state_size, n_classes], dtype=tf.float32,   #注意這里的維度
                         initializer = tf.random_normal_initializer(mean=0, stddev=1))
biases = tf.get_variable("biases", [n_classes], dtype=tf.float32, 
                        initializer = tf.random_normal_initializer(mean=0, stddev=1))

outputs, final_states = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell,
                                                       lstm_bw_cell,
                                                       x,
                                                       initial_state_fw = init_fw,
                                                       initial_state_bw = init_bw)

outputs = tf.concat(outputs, 2)   #將前向和后向的狀態(tài)連接起來
state_out = tf.matmul(tf.reshape(outputs, [-1, 2 * state_size]), weights) + biases  #注意這里的維度
logits = tf.reshape(state_out, [batch_size, time_steps, n_classes])

loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
            logits=logits, labels=y))  #計算交叉熵
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)  #優(yōu)化方法
train_op = optimizer.minimize(loss_op)

#進(jìn)行softmax計算
probs = tf.nn.softmax(logits, -1)   #-1也是默認(rèn)值遣疯,表示在最后一維進(jìn)行運算
predict = tf.argmax(probs, -1)#最大的概率在最后一維的哪一列,從0計數(shù)
                                #維度變?yōu)? batch_size * time_step

def train_network(num_epochs = 100):
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())  #初始化variable
        
        intervel = 5
        
        for epoch in range(num_epochs):
            #開始訓(xùn)練
            for idx, (time_step, inputs, labels, idxes) in enumerate(get_dump_seq_data(1)):
                _= sess.run([train_op],
                           feed_dict = {x: inputs,
                                       y:labels,
                                       batch_size:len(inputs),
                                       time_steps: time_step})
            print("epoch %d train done" % epoch)
            #這一輪訓(xùn)練完畢凿傅,計算損失值和準(zhǔn)確率
            
            if epoch % intervel == 0 and epoch > 1:
                #訓(xùn)練集誤差
                acc_record, total_df, total_acc, loss = compute_accuracy(sess, 1)  #這里是我自定義的函數(shù)缠犀,與整個架構(gòu)關(guān)系不大
                #驗證集誤差
                acc_record_dev, total_df_dev, total_acc_dev, loss_dev = compute_accuracy(sess, 0)
                print("train_acc: %.6f, train_loss: %.6f; dev_acc: %.6f, dev_loss: %.6f" % (total_acc, loss, total_acc_dev, loss_dev))
                print("- " * 50)
                if num_epochs - epoch <= intervel:
                    return acc_record, total_df, acc_record_dev, total_df_dev
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市聪舒,隨后出現(xiàn)的幾起案子辨液,更是在濱河造成了極大的恐慌,老刑警劉巖过椎,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件室梅,死亡現(xiàn)場離奇詭異戏仓,居然都是意外死亡疚宇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門赏殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敷待,“玉大人,你說我怎么就攤上這事仁热“褚荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵抗蠢,是天一觀的道長举哟。 經(jīng)常有香客問我,道長迅矛,這世上最難降的妖魔是什么妨猩? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮秽褒,結(jié)果婚禮上壶硅,老公的妹妹穿的比我還像新娘威兜。我一直安慰自己,他們只是感情好庐椒,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布椒舵。 她就那樣靜靜地躺著,像睡著了一般约谈。 火紅的嫁衣襯著肌膚如雪笔宿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天棱诱,我揣著相機(jī)與錄音措伐,去河邊找鬼。 笑死军俊,一個胖子當(dāng)著我的面吹牛侥加,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粪躬,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼担败,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镰官?” 一聲冷哼從身側(cè)響起提前,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泳唠,沒想到半個月后狈网,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡笨腥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年拓哺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖母。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡士鸥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谆级,到底是詐尸還是另有隱情烤礁,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布肥照,位于F島的核電站脚仔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舆绎。R本人自食惡果不足惜鲤脏,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亿蒸。 院中可真熱鬧凑兰,春花似錦掌桩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至音半,卻和暖如春则拷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曹鸠。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工煌茬, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彻桃。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓坛善,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邻眷。 傳聞我的和親對象是個殘疾皇子眠屎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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