keras中lstm参数_如何使用Keras为自定义NER构建深度神经网络
在這篇文章中,我們將學習如何使用Keras創建一個簡單的神經網絡來從非結構化文本數據中提取信息(NER)。
模型架構
在這里,我們將使用BILSTM + CRF層。LSTM層用于過濾不需要的信息,將僅保留重要的特征/信息,而CRF層用于處理序列數據。
BI-LSTM層
BI-LSTM用于為我們的單詞生成向量表示。 它以句子中的每個單詞作為輸入,并在兩個方向(即正向和反向)上生成每個單詞的向量表示,其中正向訪問過去的信息而反向訪問將來的信息。 然后將其與CRF層合并。
CRF層
CRF層是BI-LSTM層之上的優化。它可用于基于過去的屬性標簽有效地預測當前標簽。
數據預處理
加載數據
在本文中,我使用機器學習數據集(https://www.kaggle.com/abhinavwalia95/entity-annotated-corpus)。對于我們的機器學習模型,我們需要一個包含“ Sentence_id” /“ Sentence”列,“ word”列和“ tag”列的data frame。Python代碼如下:
import pandas as pddf = pd.read_csv("/kaggle/input/entity-annotated-corpus/ner.csv", encoding = "ISO-8859-1", error_bad_lines=False)data = df[['sentence_idx','word','tag']]data.head()在SentenceGetter中包裝輸入數據
加載數據之后,我們將使用SentenceGetter類來檢索帶有標簽的句子。Python實現如下:
class SentenceGetter(object): def __init__(self, dataset): self.n_sent = 1 self.dataset = dataset self.empty = False agg_func = lambda s: [(w, t) for w,t in zip(s["word"].values.tolist(), s["tag"].values.tolist())] self.grouped = self.dataset.groupby("sentence_idx").apply(agg_func) self.sentences = [s for s in self.grouped] def get_next(self): try: s = self.grouped["Sentence: {}".format(self.n_sent)] self.n_sent += 1 return s except: return None getter = SentenceGetter(data)sentences = getter.sentencesprint(sentences[1:3])這是三個句子的樣子:
單詞和標簽詞典
Keras(和大多數其他機器學習模型)期望所有id都是數字,這是節省內存的優化。我們將使用word2idx字典將每個單詞轉換為相應的整數ID,并使用tag2idx將tag轉換為整數ID。
from math import nanwords = list(set(data["word"].values))n_words = len(words)tags = []for tag in set(data["tag"].values): if tag is nan or isinstance(tag, float): tags.append('unk') else: tags.append(tag)n_tags = len(tags)from future.utils import iteritemsword2idx = {w: i for i, w in enumerate(words)}tag2idx = {t: i for i, t in enumerate(tags)}idx2tag = {v: k for k, v in iteritems(tag2idx)}Pad Sequence
BI-LSTM層期望所有文本/句子的長度相同。我們將填充大小選擇為最長句子的長度。Python代碼如下:
from keras.preprocessing.sequence import pad_sequencesfrom keras.utils import to_categoricalfrom sklearn.model_selection import train_test_splitmaxlen = max([len(s) for s in sentences])X = [[word2idx[w[0]] for w in s] for s in sentences]X = pad_sequences(maxlen=maxlen, sequences=X, padding="post",value=n_words - 1)y = [[tag2idx[w[1]] for w in s] for s in sentences]y = pad_sequences(maxlen=maxlen, sequences=y, padding="post", value=tag2idx["O"])y = [to_categorical(i, num_classes=n_tags) for i in y]# Split train and test dataX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)創建模型(并了解層參數)
輸入層
輸入層采用形狀參數,該參數是表示輸入數據維數的元組。
嵌入層
基本上,它是一個字典查找,它以整數作為輸入并返回關聯的向量。它包含三個參數:
- input_dim:文本數據中詞匯的大小,即n_words + 1
- output_dim:嵌入的維數
- input_length:輸入序列的長度,即最長句子的長度
BI-LSTM層
它包含五個參數:
- units:輸出空間的維數
- return_sequences:如果return_sequence = True,則返回完整的輸出序列,否則,返回輸出序列中的最后一個輸出。
- dropout:輸入線性轉換要下降的單位的分數。它介于0和1之間。
- recurrent_dropout:recurrent狀態的線性轉換要下降的單位的分數。它介于0和1之間。
- kernel_initializer:核權重矩陣的初始化程序,用于輸入的線性轉換。
TimeDistributed層
它是一個包裝器,允許我們對序列中的每個元素獨立地應用一個層。它用于序列分類,以保持輸入和輸出的一對一關系。
CRF層
我們沒有應用任何自定義的CRF層。我們已經將輸出類的數量傳遞給了CRF層。
機器學習模型Python代碼
from keras.models import Model, Inputfrom keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectionalimport keras as kfrom keras_contrib.layers import CRFinput = Input(shape=(140,))word_embedding_size = 150# Embedding Layermodel = Embedding(input_dim=n_words, output_dim=word_embedding_size, input_length=140)(input)# BI-LSTM Layermodel = Bidirectional(LSTM(units=word_embedding_size, return_sequences=True, dropout=0.5, recurrent_dropout=0.5, kernel_initializer=k.initializers.he_normal()))(model)model = LSTM(units=word_embedding_size * 2, return_sequences=True, dropout=0.5, recurrent_dropout=0.5, kernel_initializer=k.initializers.he_normal())(model)# TimeDistributed Layermodel = TimeDistributed(Dense(n_tags, activation="relu"))(model) # CRF Layercrf = CRF(n_tags)out = crf(model) # outputmodel = Model(input, out)擬合和評估模型
編譯模型
在訓練模型之前,我們需要配置學習過程。它包含三個參數:
- 優化器:它將根據看到的數據及其損失函數進行自我更新
- 損失:它將能夠根據訓練數據衡量其性能。
- 指標:機器學習模型在訓練和測試期間要評估的指標列表。
回調列表
當且僅當驗證精度提高時,它才用于將模型權重更新/保存到模型文件。它包含五個參數:
- filepath:目標模型文件的路徑
- monitor:監視模型的驗證準確性
- verbose:如果verbose = 1,它將顯示進度條和每個epoch一行,如果verbose = 0,它將不顯示任何內容,如果verbose = 2,它將只顯示每個epoch一行。
- save_best_only:如果save_best_only = True,則根據監視數量的最新最佳模型將不會被覆蓋。
- mode:如果我們希望將其最小化,則將監視值設為val_loss,將mode ='min'設置;如果我們要將其最大化,將set _ ='max'進行監視,將其設為val_acc。
擬合模型
它包含七個參數:
- X:輸入數據
- y:目標數據
- batch_size:每個梯度更新的樣本數,batch_size將默認為32。
- epochs:epoch是對所提供的整個x和y數據的迭代。訓練模型的epochs數。
- validate_split:將訓練數據的一部分用作驗證數據。
- verbose:如果verbose = 0,它將不顯示任何內容,如果verbose = 1,它將顯示進度條和每個epoch一行,如果verbose = 2,它將只顯示每個epoch一行。
- callbacks:評估期間要應用的回調列表。
總結
以上是生活随笔為你收集整理的keras中lstm参数_如何使用Keras为自定义NER构建深度神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对应生成树的基本回路_数据结构与算法——
- 下一篇: websocket心跳链接代码_Hype