手寫GRU-[TensorFlow]

2021-01-14 自然語言處理

    最近開始琢磨了下關係抽取以及標籤識別上面,這個方向也可能是接下來的工作重心傾向,然後一臉懵逼去看了CRF等等,感覺還是有些暈,應該還欠點火候,可惜接下來5-12月應該都在準備考研了,手頭堆了一堆論文都沒辦法去看了,推免應該是遙遙無期了 = =

    但是發現,在NER中,當前時刻標籤的標註是會基於上一時刻的標註結果,其實個人感覺就是循環神經網絡的機制可以完成,然而循環神經網絡輸出為隱藏單元的狀態,直接將這種狀態作為標籤應該是不夠準確的,所以大多論文中會在最後一層網絡中添加一層MLP什麼的,對隱藏單元序列進行解碼輸出所謂標籤,然而作為TensorFlow菜雞,一直就用人家封裝好的函數如下:

with tf.variable_scope('GRU-cell'):
gru_cell_fw = tf.nn.rnn_cell.GRUCell(self.HIDDEN_SIZE,

kernel_initializer=tf.orthogonal_initializer())
gru_cell_bw = tf.nn.rnn_cell.GRUCell(self.HIDDEN_SIZE,

kernel_initializer=tf.orthogonal_initializer())
gru_cell_fw = tf.contrib.rnn.DropoutWrapper(gru_cell_fw,

output_keep_prob=self.dropout_blstm_prob)
gru_cell_bw = tf.contrib.rnn.DropoutWrapper(gru_cell_bw,

output_keep_prob=self.dropout_blstm_prob)

with tf.variable_scope("BGRU",initializer=tf.orthogonal_initializer()):
(fw_outputs,bw_outputs),state = tf.nn.bidirectional_dynamic_rnn
(gru_cell_fw,gru_cell_bw,input,sequence_length=self.seq_len
,dtype="float32")

    這樣雖然特別特別的方便,但是在一些任務上,個人感覺是不夠靈活的,所以就打算自己手寫下循環神經網絡,以及遞歸神經網絡(個人感覺遞歸在表達語義上面應該表現沒有線性鏈式網絡來得好,畢竟現在網絡用語的出現,無章可循)。

    具體實現細節如下,【本文大量參考YJango大大,知乎超智能體專欄,有興趣可以去看看大佬的】

    我的只是有些東西自己進行改動,加入了一些自己的理解注釋。

import tensorflow as tf
import config
import numpy as np

class GRU_Cell(object):

def __init__(self,incoming,reverse=False):
"""
       :param incoming:輸入的數據
       :param Wz:更新門輸入相應權重
       :param Uz:前一隱藏門的相應權重值
       :param W:候選激活門的輸入相應權重值
       :param U:候選門重置門對應權重
       :param Wr:重置門的相應權重
       :param Ur:重置門的相應權重
       """
       if reverse == False: #方便於設置雙向網絡,從不同方向來encode 語句
           self.incoming = incoming
elif reverse == True:
self.incoming = tf.reverse(incoming,axis=[1])
else:
raise AttributeError("Without this attribute{}".format(reverse))
with tf.variable_scope("Gate_weight"):
self.Wz = self.orthogonal_initializer(
[config.embedding_size,config.hidden_size],"Wz")
self.W = self.orthogonal_initializer(
[config.embedding_size, config.hidden_size], "W")
self.Wr = self.orthogonal_initializer(
[config.embedding_size, config.hidden_size], "Wr")
self.Uz = self.orthogonal_initializer(
[config.hidden_size,config.hidden_size],"Uz")
self.U = self.orthogonal_initializer(
[config.hidden_size,config.hidden_size],"U")
self.Ur = self.orthogonal_initializer(
[config.hidden_size,config.hidden_size],"Ur")

self.init_state = tf.matmul(self.incoming[:, 0, :],
tf.zeros((config.embedding_size,config.hidden_size)))
self.incoming = tf.transpose(self.incoming, perm=[1,0,2])

def orthogonal_initializer(self,shape, name,
        scale=1.0):
"""
       
       :param shape: Variable size
       :param name: Variable name
       :param scale:  scale=1.0
       :return: tensor
       """

       scale = 1.0
       flat_shape = (shape[0], np.prod(shape[1:]))
a = np.random.normal(0.0, 1.0, flat_shape)
u, _, v = np.linalg.svd(a, full_matrices=False)
q = u if u.shape == flat_shape else v
q = q.reshape(shape) # this needs to be corrected to float32
       return tf.Variable(scale * q[:shape[0], :shape[1]],
trainable=True, dtype=tf.float32, name=name)

def one_step(self,Privious_state,current_x):
with tf.variable_scope("update"):
"""
               Zt = sigmoid(Wz*Xt+Uz*H(t-1))
               """
               Zt = tf.sigmoid((tf.matmul(current_x, self.Wz))
+tf.matmul(Privious_state, self.Uz))
with tf.variable_scope("reset"):
"""
               Rt = sigmoid(Wr*Xt+Ur*H(t-1))
               """
               Rt = tf.sigmoid(tf.matmul(current_x, self.Wr)+
tf.matmul(Privious_state, self.Ur))
with tf.variable_scope("candidate"):
"""
               Ch = tanh(W*Xt+U*(rt.*H(t-1))
               """
               Ch = tf.tanh(tf.matmul(current_x, self.W)+
tf.matmul(tf.multiply(Rt, Privious_state),self.U))

with tf.variable_scope("cell"):
"""
               Ht = (1-Zt)*H(t-1)+Zt*Ch
               """
               Ht = tf.multiply((1-Zt), Privious_state)+
tf.multiply(Zt, Ch)
return Ht
def all_step(self):
all_hidden_state = tf.scan
(fn=self.one_step, elems=self.incoming, initializer=self.init_state)
return tf.transpose(all_hidden_state, perm=[1,0,2])

    這邊解釋下tf.scan這個神器,其實這個跟python中的scan功能是差不多,Fn是你所需要執行的函數,one_step()函數第一參數為過去的值,而第二個參數為當前輸入值,而elems則是你的數據源,這個函數我認為才是整個核心所在,中間的對角初始化函數是直接copy別人寫好的

orthogonal_initializer

    大概就隨筆寫到這邊,接下來時間應該都是準備考研了,當然也會準備下暑期的夏令營,若有老師或者師兄師姐願意分享經驗,感激不盡!

    kris@stu.sicau.edu.cn 

    拙文一篇,望各位看官多多指出問題

相關焦點

  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    HTTP/REST API at:localhost:8501 …$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    》連結:http://www.leiphone.com/news/201702/vJpJqREn7EyoAd09.html本文介紹了 graph 與 session 等基本組件,解釋了 rank 和 shape 等基礎數據結構概念,講解了一些 variable 需要注意的地方並介紹了 placeholders 與 feed_dict 。最
  • TensorFlow官方力推、GitHub爆款項目:用Attention模型自動生成...
    tf.keras: https://www.tensorflow.org/guide/keras eager execution: https://www.tensorflow.org/guide/eager 這款筆記是一種
  • TensorFlow 資源大全中文版
    (點擊上方藍字,快速關注我們)譯文:伯樂在線專欄作者 - Yalye英文:jtoy如有好文章投稿
  • 步履不停:TensorFlow 2.4新功能一覽!
    參數伺服器訓練教程           https://tensorflow.google.cn/tutorials/distribute/parameter_server_training    ClusterCoordinator           https://tensorflow.google.cn/api_docs/python
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • TensorFlow 中文資源全集,學習路徑推薦
    https://gitee.com/fendouai/Awesome-TensorFlow-Chinese很多內容下面這個英文項目:Inspired by https://github.com/jtoy/awesome-tensorflow官方網站官網:https://www.tensorflow.org/中文:https://tensorflow.google.cn
  • 直觀理解並使用Tensorflow實現Seq2Seq模型的注意機制
    目標在Tensorflow中實現、訓練和測試一個英語到印地語機器翻譯模型。對編碼器、解碼器、注意機制的作用形成直觀透徹的理解。討論如何進一步改進現有的模型。讀數據集首先,導入所有需要的庫。在這個實現中使用的英語到印地語語料庫可以在Kaggle找到。
  • 終於來了,TensorFlow 新增官方 Windows 支持
    現在你可以使用命令 C:\> pip install tensorflow 安裝 TensorFlow 了。GPU 支持的命令:C:\> pip install tensorflow-gpu有關 TensorFlow Windows 支持的更多細節請閱讀 r0.12 的版本注釋。
  • 玩轉TensorFlow?你需要知道這30功能
    地址是:tensorflow.org/tfx/?網址是:https://www.tensorflow.org/tfx/transform/?網址是:https://www.tensorflow.org/serving/?
  • 在Windows中安裝Tensorflow和Kears深度學習框架
    在命令提示符窗口輸入下列命令: 建立Tensorflow Anaconda虛擬環境 conda create --name tensorflow python=3.5 anaconda 執行後屏界面顯示如圖3-9所示。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    然後,我們將使用MNIST手寫數字分類數據集,並在PyTorch和TensorFlow中使用CNN(卷積神經網絡)建立圖像分類模型。這將是你的起點,然後你可以選擇自己喜歡的任何框架,也可以開始構建其他計算機視覺模型。
  • 5個簡單的步驟掌握Tensorflow的Tensor
    在這篇文章中,我們將深入研究Tensorflow Tensor的細節。我們將在以下五個簡單步驟中介紹與Tensorflow的Tensor中相關的所有主題:第一步:張量的定義→什麼是張量?我們經常將NumPy與TensorFlow一起使用,因此我們還可以使用以下行導入NumPy:import tensorflow as tfimport numpy as np張量的創建:創建張量對象有幾種方法可以創建tf.Tensor對象。讓我們從幾個例子開始。
  • 入門| Tensorflow實戰講解神經網絡搭建詳細過程
    本文將通過一個經典的案例:MNIST手寫數字識別,以代碼的形式來為大家梳理一遍神經網絡的整個過程。  一 、MNIST手寫數字數據集介紹  MNIST手寫數字數據集來源於是美國國家標準與技術研究所,是著名的公開數據集之一,通常這個數據集都會被作為深度學習的入門案例。
  • 深度解讀TensorFlow,了解它的最新發展!
    Tensorboard是tensorflow內置的一個可視化工具,它通過將tensorflow程序輸出的日誌文件的信息可視化,使得tensorflow程序的理解、調試和優化更加簡單高效。Tensorboard的可視化依賴於tensorflow程序運行輸出的日誌文件,因而tensorboard和tensorflow程序在不同的進程中運行。
  • 最簡單的深度學習TensorFlow應用舉例!
    小編我的電腦很一般,沒有32G內存,也沒有1080,就windows上直接裝了23333windows+python 3.6+pycharm+tensorflow cpu話不多說,直接線性回歸,上圖。代碼截圖#接下來貼代碼#辰星樹洞import numpy as np #這是Python的一種開源的數值計算擴展,非常強大import tensorflow
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    作者:魯偉 一個數據科學踐行者的學習日記。
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    開始菜單運行anaconda navigator檢查是否安裝了notebook(默認有安裝)三、安裝tensorflow/keras在激活的環境中安裝:1. 如果機器上有gpu,則安裝gpu版本,沒有GPU就安裝cpu版。