亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

TensorFlow實(shí)現(xiàn)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)

 更新時(shí)間:2018年02月28日 10:35:23   作者:ChenVast  
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)RNN循環(huán)神經(jīng)網(wǎng)絡(luò),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

RNN(recurrent neural Network)循環(huán)神經(jīng)網(wǎng)絡(luò)

主要用于自然語言處理(nature language processing,NLP)

RNN主要用途是處理和預(yù)測(cè)序列數(shù)據(jù)

RNN廣泛的用于 語音識(shí)別、語言模型、機(jī)器翻譯

RNN的來源就是為了刻畫一個(gè)序列當(dāng)前的輸出與之前的信息影響后面節(jié)點(diǎn)的輸出

RNN 是包含循環(huán)的網(wǎng)絡(luò),允許信息的持久化

RNN會(huì)記憶之前的信息,并利用之前的信息影響后面節(jié)點(diǎn)的輸出。

RNN的隱藏層之間的節(jié)點(diǎn)是有相連的,隱藏層的輸入不僅僅包括輸入層的輸出,還包括上一時(shí)刻隱藏層的輸出。

RNN會(huì)對(duì)于每一個(gè)時(shí)刻的輸入結(jié)合當(dāng)前模型的狀態(tài)給出一個(gè)輸出。

RNN理論上被看作同一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)被無限復(fù)制的結(jié)果,目前RNN無法做到真正的無限循環(huán),一般以循環(huán)體展開。

RNN圖:


RNN最擅長(zhǎng)的問題是與時(shí)間序列相關(guān)的。

RNN對(duì)于一個(gè)序列數(shù)據(jù),可以將序列上不同時(shí)刻的數(shù)據(jù)依次輸入循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入層,而輸出可以是對(duì)序列中下一個(gè)時(shí)刻的預(yù)測(cè),也可以是對(duì)當(dāng)前時(shí)刻信息的處理結(jié)果。

RNN 的關(guān)鍵點(diǎn)之一就是他們可以用來連接先前的信息到當(dāng)前的任務(wù)上

展開后的RNN


循環(huán)體網(wǎng)絡(luò)中的參數(shù)在不同的時(shí)刻也是共享的。

RNN的狀態(tài)是通過一個(gè)向量來表示,這個(gè)向量的維度也稱為RNN隱藏層的大小。

假如該向量為h,輸入為x,激活函數(shù)為tanh,則有如圖:


前向傳播的計(jì)算過程:


理論上RNN可以支持任意長(zhǎng)度的序列,但是如果序列太長(zhǎng)會(huì)導(dǎo)致優(yōu)化時(shí)實(shí)現(xiàn)梯度消失的問題,一般會(huì)設(shè)置最大長(zhǎng)度,超長(zhǎng)會(huì)對(duì)其截?cái)唷?/p>

 代碼實(shí)現(xiàn)簡(jiǎn)單的RNN:

import numpy as np 
 
# 定義RNN的參數(shù)。 
X = [1,2] 
state = [0.0, 0.0] 
w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]]) 
w_cell_input = np.asarray([0.5, 0.6]) 
b_cell = np.asarray([0.1, -0.1]) 
w_output = np.asarray([[1.0], [2.0]]) 
b_output = 0.1 
 
# 執(zhí)行前向傳播過程。 
for i in range(len(X)): 
  before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell 
  state = np.tanh(before_activation) 
  final_output = np.dot(state, w_output) + b_output 
  print ("before activation: ", before_activation) 
  print ("state: ", state) 
  print ("output: ", final_output) 

LSTM(long short-term memory)長(zhǎng)短時(shí)記憶網(wǎng)絡(luò): 

LSTM解決了RNN不支持長(zhǎng)期依賴的問題,使其大幅度提升記憶時(shí)長(zhǎng)。

RNN被成功應(yīng)用的關(guān)鍵就是LSTM。

LSTM是一種擁有三個(gè)“門”結(jié)構(gòu)的特殊網(wǎng)絡(luò)結(jié)構(gòu)。


粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學(xué)習(xí)到的神經(jīng)網(wǎng)絡(luò)層。合在一起的線表示向量的連接,分開的線表示內(nèi)容被復(fù)制,然后分發(fā)到不同的位置。

LSTM核心思想:

LSTM 的關(guān)鍵就是細(xì)胞狀態(tài),水平線在圖上方貫穿運(yùn)行。

細(xì)胞狀態(tài)類似于傳送帶。直接在整個(gè)鏈上運(yùn)行,只有一些少量的線性交互,信息在上面流傳保持不變會(huì)很容易。


LSTM 有通過精心設(shè)計(jì)的稱作為“門”的結(jié)構(gòu)來去除或者增加信息到細(xì)胞狀態(tài)的能力

“門”是一種讓信息選擇式通過的方法,包含一個(gè)sigmoid 神經(jīng)網(wǎng)絡(luò)層和一個(gè) pointwise (按位做乘法)的操作。

之所以稱之為“門”,因?yàn)?strong>使用Sigmoid 作為激活函數(shù)的層會(huì)輸出 0 到 1 之間的數(shù)值,描述每個(gè)部分有多少信息量可以通過這個(gè)結(jié)構(gòu)。

0 代表“不許任何量通過”,1 就指“允許任意量通過”!

LSTM的公式:


代碼實(shí)現(xiàn):

import tensorflow as tf 
 
 
# 定義一個(gè)LSTM結(jié)構(gòu) 
lstm = rnn_cell.BasicLSTMCell(lstm_hidden_size) 
 
# 將LSTM中的狀態(tài)初始化為全0數(shù)組,每次使用一個(gè)batch的訓(xùn)練樣本 
state = lstm.zero_state(batch_size,tf.float32) 
 
# 定義損失函數(shù) 
loss = 0.0 
 
# 規(guī)定一個(gè)最大序列長(zhǎng)度 
for i in range(num_steps): 
  # 復(fù)用之前定義的變量 
  if i > 0: 
    tf.get_variable_scope().reuse_variables() 
  # 將當(dāng)前輸入和前一時(shí)刻的狀態(tài)傳入定義的LSTM結(jié)構(gòu),得到輸出和更新后的狀態(tài) 
  lstm_output, state = lstm(current_input,state) 
   
  # 將當(dāng)前時(shí)刻的LSTM結(jié)構(gòu)的輸出傳入一個(gè)全連接層得到最后的輸出。 
  final_output = fully_connectd(lstm_output) 
   
  # 計(jì)算當(dāng)前時(shí)刻輸出的損失 
  loss += calc_loss(final_output,expected_output) 

雙向循環(huán)神經(jīng)網(wǎng)絡(luò)

經(jīng)典的循環(huán)神經(jīng)網(wǎng)絡(luò)中的狀態(tài)傳輸是從前往后單向的,然而當(dāng)前時(shí)刻的輸出不僅和之前的狀態(tài)有關(guān)系,也和之后的狀態(tài)相關(guān)。

雙向循環(huán)神經(jīng)網(wǎng)絡(luò)能解決狀態(tài)單向傳輸?shù)膯栴}。

雙向循環(huán)神經(jīng)網(wǎng)絡(luò)是由兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)反向上下疊加在一起組成,兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)的狀態(tài)共同決定輸出。

也就是時(shí)間t時(shí)的輸出不僅僅取決于過去的記憶,也同樣取決于后面發(fā)生的事情。


深層(雙向)循環(huán)神經(jīng)網(wǎng)絡(luò)

深層循環(huán)神經(jīng)網(wǎng)絡(luò)似于雙向循環(huán)神經(jīng)網(wǎng)絡(luò),只不過是每個(gè)時(shí)長(zhǎng)內(nèi)都有多層。

深層循環(huán)神經(jīng)網(wǎng)絡(luò)有更強(qiáng)的學(xué)習(xí)能力。

深層循環(huán)神經(jīng)網(wǎng)絡(luò)在每個(gè)時(shí)刻上將循環(huán)體結(jié)構(gòu)復(fù)制多次,和卷積神經(jīng)網(wǎng)絡(luò)類似,每一層循環(huán)體中的參數(shù)是一致的,不同層的參數(shù)可以不同。


TensorFlow中使用MultiRNNCell實(shí)現(xiàn)深層循環(huán)神經(jīng)網(wǎng)絡(luò)中每一個(gè)時(shí)刻的前向傳播過程。剩下的步驟和RNN的構(gòu)建步驟相同。

RNN中的dropout

通過dropout方法可以上卷積神經(jīng)網(wǎng)絡(luò)更加健壯,類似的用在RNN上也能取得同樣的效果。

類似卷積神經(jīng)網(wǎng)絡(luò),RNN只在最后的全連接層使用dropout。

RNN一般只在不同層循環(huán)體結(jié)構(gòu)中使用dropout,不在同層循環(huán)體使用。

同一時(shí)刻t中,不同循環(huán)體之間會(huì)使用dropout。

在TensorFlow中,使用DropoutWrapper類實(shí)現(xiàn)dropout功能。

通過input_keep_prob參數(shù)控制輸入的dropout概率

通過output_keep_prob參數(shù)控制輸出的dropout概率

TensorFlow樣例實(shí)現(xiàn)RNN語言模型

代碼:

import numpy as np 
import tensorflow as tf 
import reader 
  
DATA_PATH = "../datasets/PTB/data" 
HIDDEN_SIZE = 200 # 隱藏層規(guī)模 
NUM_LAYERS = 2 # 深層RNN中的LSTM結(jié)構(gòu)的層數(shù) 
VOCAB_SIZE = 10000 # 單詞標(biāo)識(shí)符個(gè)數(shù) 
 
LEARNING_RATE = 1.0 # 學(xué)習(xí)速率 
TRAIN_BATCH_SIZE = 20 # 訓(xùn)練數(shù)據(jù)大小 
TRAIN_NUM_STEP = 35 # 訓(xùn)練數(shù)據(jù)截?cái)嚅L(zhǎng)度 
 
# 測(cè)試時(shí)不需要截?cái)?
EVAL_BATCH_SIZE = 1 # 測(cè)試數(shù)據(jù)大小 
EVAL_NUM_STEP = 1 # 測(cè)試數(shù)據(jù)截?cái)嚅L(zhǎng)度 
NUM_EPOCH = 2 # 使用訓(xùn)練數(shù)據(jù)輪數(shù) 
KEEP_PROB = 0.5 # 節(jié)點(diǎn)不被dropout 
MAX_GRAD_NORM = 5 # 控制梯度膨脹參數(shù) 
 
 
# 定義一個(gè)類來描述模型結(jié)構(gòu)。 
class PTBModel (object): 
  def __init__(self, is_training, batch_size, num_steps): 
 
    self.batch_size = batch_size 
    self.num_steps = num_steps 
 
    # 定義輸入層。 
    self.input_data = tf.placeholder (tf.int32, [batch_size, num_steps]) 
    self.targets = tf.placeholder (tf.int32, [batch_size, num_steps]) 
 
    # 定義使用LSTM結(jié)構(gòu)及訓(xùn)練時(shí)使用dropout。 
    lstm_cell = tf.contrib.rnn.BasicLSTMCell (HIDDEN_SIZE) 
    if is_training: 
      lstm_cell = tf.contrib.rnn.DropoutWrapper (lstm_cell, output_keep_prob=KEEP_PROB) 
    cell = tf.contrib.rnn.MultiRNNCell ([lstm_cell] * NUM_LAYERS) 
 
    # 初始化最初的狀態(tài)。 
    self.initial_state = cell.zero_state (batch_size, tf.float32) 
    embedding = tf.get_variable ("embedding", [VOCAB_SIZE, HIDDEN_SIZE]) 
 
    # 將原本單詞ID轉(zhuǎn)為單詞向量。 
    inputs = tf.nn.embedding_lookup (embedding, self.input_data) 
 
    if is_training: 
      inputs = tf.nn.dropout (inputs, KEEP_PROB) 
 
    # 定義輸出列表。 
    outputs = [] 
    state = self.initial_state 
    with tf.variable_scope ("RNN"): 
      for time_step in range (num_steps): 
        if time_step > 0: tf.get_variable_scope ().reuse_variables () 
        cell_output, state = cell (inputs[:, time_step, :], state) 
        outputs.append (cell_output) 
    output = tf.reshape (tf.concat (outputs, 1), [-1, HIDDEN_SIZE]) 
    weight = tf.get_variable ("weight", [HIDDEN_SIZE, VOCAB_SIZE]) 
    bias = tf.get_variable ("bias", [VOCAB_SIZE]) 
    logits = tf.matmul (output, weight) + bias 
 
    # 定義交叉熵?fù)p失函數(shù)和平均損失。 
    loss = tf.contrib.legacy_seq2seq.sequence_loss_by_example ( 
      [logits], 
      [tf.reshape (self.targets, [-1])], 
      [tf.ones ([batch_size * num_steps], dtype=tf.float32)]) 
    self.cost = tf.reduce_sum (loss) / batch_size 
    self.final_state = state 
 
    # 只在訓(xùn)練模型時(shí)定義反向傳播操作。 
    if not is_training: return 
    trainable_variables = tf.trainable_variables () 
 
    # 控制梯度大小,定義優(yōu)化方法和訓(xùn)練步驟。 
    grads, _ = tf.clip_by_global_norm (tf.gradients (self.cost, trainable_variables), MAX_GRAD_NORM) 
    optimizer = tf.train.GradientDescentOptimizer (LEARNING_RATE) 
    self.train_op = optimizer.apply_gradients (zip (grads, trainable_variables)) 
 
 
 
# 使用給定的模型model在數(shù)據(jù)data上運(yùn)行train_op并返回在全部數(shù)據(jù)上的perplexity值 
def run_epoch(session, model, data, train_op, output_log, epoch_size): 
  total_costs = 0.0 
  iters = 0 
  state = session.run(model.initial_state) 
 
  # 訓(xùn)練一個(gè)epoch。 
  for step in range(epoch_size): 
    x, y = session.run(data) 
    cost, state, _ = session.run([model.cost, model.final_state, train_op], 
                    {model.input_data: x, model.targets: y, model.initial_state: state}) 
    total_costs += cost 
    iters += model.num_steps 
 
    if output_log and step % 100 == 0: 
      print("After %d steps, perplexity is %.3f" % (step, np.exp(total_costs / iters))) 
  return np.exp(total_costs / iters) 
 
 
# 定義主函數(shù)并執(zhí)行 
def main(): 
  train_data, valid_data, test_data, _ = reader.ptb_raw_data(DATA_PATH) 
 
  # 計(jì)算一個(gè)epoch需要訓(xùn)練的次數(shù) 
  train_data_len = len(train_data) 
  train_batch_len = train_data_len // TRAIN_BATCH_SIZE 
  train_epoch_size = (train_batch_len - 1) // TRAIN_NUM_STEP 
 
  valid_data_len = len(valid_data) 
  valid_batch_len = valid_data_len // EVAL_BATCH_SIZE 
  valid_epoch_size = (valid_batch_len - 1) // EVAL_NUM_STEP 
 
  test_data_len = len(test_data) 
  test_batch_len = test_data_len // EVAL_BATCH_SIZE 
  test_epoch_size = (test_batch_len - 1) // EVAL_NUM_STEP 
 
  initializer = tf.random_uniform_initializer(-0.05, 0.05) 
  with tf.variable_scope("language_model", reuse=None, initializer=initializer): 
    train_model = PTBModel(True, TRAIN_BATCH_SIZE, TRAIN_NUM_STEP) 
 
  with tf.variable_scope("language_model", reuse=True, initializer=initializer): 
    eval_model = PTBModel(False, EVAL_BATCH_SIZE, EVAL_NUM_STEP) 
 
  # 訓(xùn)練模型。 
  with tf.Session() as session: 
    tf.global_variables_initializer().run() 
 
    train_queue = reader.ptb_producer(train_data, train_model.batch_size, train_model.num_steps) 
    eval_queue = reader.ptb_producer(valid_data, eval_model.batch_size, eval_model.num_steps) 
    test_queue = reader.ptb_producer(test_data, eval_model.batch_size, eval_model.num_steps) 
 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(sess=session, coord=coord) 
 
    for i in range(NUM_EPOCH): 
      print("In iteration: %d" % (i + 1)) 
      run_epoch(session, train_model, train_queue, train_model.train_op, True, train_epoch_size) 
 
      valid_perplexity = run_epoch(session, eval_model, eval_queue, tf.no_op(), False, valid_epoch_size) 
      print("Epoch: %d Validation Perplexity: %.3f" % (i + 1, valid_perplexity)) 
 
    test_perplexity = run_epoch(session, eval_model, test_queue, tf.no_op(), False, test_epoch_size) 
    print("Test Perplexity: %.3f" % test_perplexity) 
 
    coord.request_stop() 
    coord.join(threads) 
 
if __name__ == "__main__": 
  main() 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python Pygame實(shí)戰(zhàn)之水果忍者游戲的實(shí)現(xiàn)

    Python Pygame實(shí)戰(zhàn)之水果忍者游戲的實(shí)現(xiàn)

    大家還記得水果忍者這個(gè)游戲嗎?想當(dāng)年,這也是個(gè)風(fēng)靡全國的游戲,基本每個(gè)人都玩過。今天小編就用Python中的Pygame庫復(fù)刻這一經(jīng)典游戲,需要的可以參考一下
    2022-02-02
  • django中顯示字符串的實(shí)例方法

    django中顯示字符串的實(shí)例方法

    在本篇文章里小編給大家整理了一篇關(guān)于django中顯示字符串的實(shí)例方法,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-03-03
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測(cè)篇解讀

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測(cè)篇解讀

    這篇文章我們繼續(xù)學(xué)習(xí)一下GBDT模型的另一個(gè)進(jìn)化版本:LightGBM,LigthGBM是boosting集合模型中的新進(jìn)成員,由微軟提供,它和XGBoost一樣是對(duì)GBDT的高效實(shí)現(xiàn),原理上它和GBDT及XGBoost類似,都采用損失函數(shù)的負(fù)梯度作為當(dāng)前決策樹的殘差近似值,去擬合新的決策樹
    2022-01-01
  • Keras自動(dòng)下載的數(shù)據(jù)集/模型存放位置介紹

    Keras自動(dòng)下載的數(shù)據(jù)集/模型存放位置介紹

    這篇文章主要介紹了Keras自動(dòng)下載的數(shù)據(jù)集/模型存放位置介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 如何查看python中安裝庫的文件位置

    如何查看python中安裝庫的文件位置

    這篇文章主要介紹了查看python中安裝庫的文件位置的方法,python自帶標(biāo)準(zhǔn)庫位置在安裝環(huán)境的lib文件夾下的.py文件都是,在環(huán)境的lib文件夾中,本文給大家詳細(xì)講解需要的朋友可以參考下
    2022-11-11
  • Python群發(fā)郵件實(shí)例代碼

    Python群發(fā)郵件實(shí)例代碼

    今天試了試Python發(fā)郵件,突然想到能不能群發(fā)郵件呢?群發(fā)郵件是smtplib的一個(gè)bug,不過最終還是解決了
    2014-01-01
  • 使用python+pygame實(shí)現(xiàn)中秋節(jié)動(dòng)畫效果

    使用python+pygame實(shí)現(xiàn)中秋節(jié)動(dòng)畫效果

    馬上就要中秋節(jié)了,使用python可以實(shí)現(xiàn)中秋節(jié)動(dòng)畫效果,包括月亮、兔子和煙花嗎?當(dāng)然是可以的,那該如何實(shí)現(xiàn)呢?這篇文章我們主要使用pygame來實(shí)現(xiàn),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-09-09
  • Python 代碼在函數(shù)中運(yùn)行得更快的原因解析

    Python 代碼在函數(shù)中運(yùn)行得更快的原因解析

    我們知道,python 是一種解釋型語言,它會(huì)逐行讀取并執(zhí)行代碼,小伙伴們可能會(huì)有這個(gè)疑問:為什么在函數(shù)中運(yùn)行的 Python 代碼速度更快,今天這篇文章將會(huì)解答大家心中的疑惑
    2023-09-09
  • python爬蟲常見錯(cuò)誤集合

    python爬蟲常見錯(cuò)誤集合

    這篇文章主要介紹了python爬蟲常見錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python獲取Redis所有Key以及內(nèi)容的方法

    Python獲取Redis所有Key以及內(nèi)容的方法

    今天小編就為大家分享一篇Python獲取Redis所有Key以及內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評(píng)論