日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Keras实现seq2seq案例代码:Bi-LSTM

發(fā)布時(shí)間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Keras实现seq2seq案例代码:Bi-LSTM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1. 案例介紹

2. 代碼實(shí)現(xiàn)

代碼一:為模型創(chuàng)建輸入

代碼二:構(gòu)建模型

代碼三:檢驗(yàn)?zāi)P托阅?/p>


1. 案例介紹

?為便于講解seq2seq模型用例,我們采用一篇研究論文中所使用的注釋預(yù)料庫(kù)的文本內(nèi)容。

論文:《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》,即“開(kāi)發(fā)基準(zhǔn)語(yǔ)料庫(kù),以支持從醫(yī)療病例報(bào)告中自動(dòng)提取與藥物有關(guān)的不良反應(yīng)”

詞向量模型:我們使用開(kāi)源模型skip-gram,該模型由NLPLab(http://evexdb.org/pmresources/vec-spacemodels/wikipedia-pubmed-and-PMC-w2v.bin)提供,該模型對(duì)所有的PubMed摘要和PMC全文(408萬(wàn)個(gè)單詞)進(jìn)行了訓(xùn)練。skip-gram模型的輸出是一個(gè)具有200維度的字向量集。

語(yǔ)料庫(kù):論文中使用的ADE語(yǔ)料庫(kù)包括三個(gè)文件,DRUG-AE.rel、DRUG-DOSE.rel、DRUG-NEG.txt,我們將利用文件DRUG-AE.rel,其提供了藥物與不良反應(yīng)之間的關(guān)系。DRUG-AE.rel文件的格式如下,列與列之間由管道分隔符“|”隔開(kāi):

列-1:PubMed-ID

列-2:句子

列-3:不良反應(yīng)

列-4:不良反應(yīng)在“文檔級(jí)別”的起始位移

列-5:不良反應(yīng)在“文檔級(jí)別”的結(jié)束位移

列-6:藥物

列-7:藥物在“文檔級(jí)別”的起始位移

列-8:藥物在“文檔級(jí)別”的結(jié)束位移

2. 代碼實(shí)現(xiàn)

代碼一:為模型創(chuàng)建輸入

#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author: Hou-Hou""" 《deep learning for natural language processing creating neural networks with python》"""import re import numpy as npimport nltk from string import punctuation # 找出字符串中的所有的標(biāo)點(diǎn)(針對(duì)英文) from gensim.models import KeyedVectorsimport keras import tensorflow import copy from keras.preprocessing.sequence import pad_sequences# 檢查版本 print(keras.__version__) # 2.2.4 print(tensorflow.__version__) # 1.7.0def create_input():# 加載預(yù)訓(xùn)練的詞向量EMBEDDING_FILE = 'wikipedia-pubmed-and-PMC-w2v.bin'word2vec = KeyedVectors.load_word2vec_format(EMBEDDING_FILE,binary=True)print('Found %s word vectors of word2vec' % len(word2vec.vocab))TEXT_FILE = 'DRUG-AE.rel'# 為模型創(chuàng)建輸入f = open(TEXT_FILE, 'r')input_data_ae = []op_labels_ae = []sentences = []for each_line in f.readlines():sent_list = np.zeros([0, 200])labels = np.zeros([0, 3])tokens = each_line.split('|')sent = tokens[1]if sent in sentences:continuesentences.append(sent)begin_offset = int(tokens[3])end_offset = int(tokens[4])mid_offset = range(begin_offset+1, end_offset)word_tokens = nltk.word_tokenize(sent)offset = 0for each_token in word_tokens:offset = sent.find(each_token, offset)offset1 = copy.deepcopy(offset)offset += len(each_token)if each_token in punctuation or re.search(r'\d', each_token):continue # 若each_token為標(biāo)點(diǎn)符號(hào)或數(shù)字,則跳過(guò)each_token = each_token.lower()each_token = re.sub("[^A-Za-z\-]+", "", each_token)if each_token in word2vec.wv.vocab:# 獲取訓(xùn)練好后所有的詞:model.vocab或model.wv.vocabnew_word = word2vec.word_vec(each_token) # 若單詞在詞匯表中,將其轉(zhuǎn)換為向量if offset1 == begin_offset:sent_list = np.append(sent_list, np.array([new_word]), axis=0)labels = np.append(labels, np.array([[0,0,1]]), axis=0)elif offset == end_offset or offset in mid_offset:sent_list = np.append(sent_list, np.array([new_word]), axis=0)labels = np.append(labels, np.array([[0,1,0]]), axis=0)else:sent_list = np.append(sent_list, np.array([new_word]), axis=0)labels = np.append(labels, np.array([[1,0,0]]), axis=0)input_data_ae.append(sent_list)op_labels_ae.append(labels)input_data_ae = np.array(input_data_ae)op_labels_ae = np.array(op_labels_ae)# 給輸入文本添加填充項(xiàng):最大長(zhǎng)度為30input_data_ae = pad_sequences(input_data_ae, maxlen=30, dtype='float64', padding='post')op_labels_ae = pad_sequences(op_labels_ae, maxlen=30, dtype='float64', padding='post')return input_data_ae, op_labels_ae

(1)copy.copy() 淺拷貝:拷貝了最外圍的對(duì)象本身,內(nèi)部的元素都只是拷貝了一個(gè)引用而已。也就是,把對(duì)象復(fù)制一遍,但是該對(duì)象中引用的其他對(duì)象我不復(fù)制
? ? ? ? ?copy.deepcopy() 深拷貝:外圍和內(nèi)部元素都進(jìn)行了拷貝對(duì)象本身,而不是引用。也就是,把對(duì)象復(fù)制一遍,并且該對(duì)象中引用的其他對(duì)象我也復(fù)制

(2)find() 方法:檢測(cè)字符串中是否包含子字符串 str ,如果指定 beg(開(kāi)始) 和 end(結(jié)束) 范圍,則檢查是否包含在指定范圍內(nèi)。如果包含子字符串返回開(kāi)始的索引值,否則返回 - 1。

(3)re.sub(pattern, repl, string, count=0, flags=0)
? ? ? ? ? ? ? ? pattern:表示正則表達(dá)式中的模式字符串;
? ? ? ? ? ? ? ? repl:被替換的字符串(既可以是字符串,也可以是函數(shù));
? ? ? ? ? ? ? ? string:要被處理的,要被替換的字符串;
? ? ? ? ? ? ? ? count:匹配的次數(shù), 默認(rèn)是全部替換

代碼二:構(gòu)建模型

? ? ? 定義模型體系結(jié)構(gòu),我們使用雙向LSTM網(wǎng)絡(luò)的一個(gè)隱藏層,它有300個(gè)隱藏單元;除此之外,還使用一個(gè)時(shí)間分布稠密層,將在每個(gè)時(shí)間步上應(yīng)用一個(gè)全連接的稠密層,按時(shí)間步分別得到輸出。

#!/usr/bin/env python3 # -*- coding:utf-8 -*- # Author: Hou-Houimport datetime import os from keras.layers import Dense, Input, LSTM, Dropout,Bidirectional, TimeDistributed from keras.models import Model from keras.layers.normalization import BatchNormalization from keras.callbacks import EarlyStopping, ModelCheckpointfrom create_input import *input_data_ae, op_labels_ae = create_input()# 創(chuàng)建訓(xùn)練、驗(yàn)證數(shù)據(jù)集:訓(xùn)練=4000, 驗(yàn)證=271 x_train = input_data_ae[:4000] x_test = input_data_ae[4000:] y_train = input_data_ae[:4000] y_test = input_data_ae[4000:]batch = 1# 創(chuàng)建網(wǎng)絡(luò)結(jié)構(gòu) def build_model():xin = Input(batch_shape=(None, 30, 200), dtype='float')seq = Bidirectional(LSTM(300, return_state=True), merge_mode='concat')(xin)# 雙向RNN包裝器,merge_mode:前向和后向RNN輸出的結(jié)合方式mlp1 = Dropout(0.2)(seq)mlp2 = TimeDistributed(Dense(60, activation='softmax'))(mlp1) # 該包裝器可以把一個(gè)層應(yīng)用到輸入的每一個(gè)時(shí)間步上mlp3 = Dropout(0.2)(mlp2)mlp4 = TimeDistributed(Dense(3, activation='softmax'))(mlp3)model = Model(inputs=xin, outputs=mlp4)model.compile(optimizer='Adam', loss='categorical_crossentropy')# 訓(xùn)練model.fit(x_train, y_train,batch_size=batch,epochs=50,validation_data=(x_test, y_test))save_fname = os.path.join('./', '%s-e%s-3.h5' % (datetime.datetime.now().strftime('%Y%m%d-%H%M%S'), str(50)))model.save(save_fname)return modelmodel = build_model()# 預(yù)測(cè) val_pred = model.predict(x_test, batch_size=batch) labels = [] for i in range(len(val_pred)):b = np.zeros_like(val_pred[i])b[np.arange(len(val_pred[i])), val_pred[i].argmax(1)]=1labels.append(b) print('val_pred=', val_pred.shape)

訓(xùn)練結(jié)果:

?

代碼三:檢驗(yàn)?zāi)P托阅?/h2> # 檢驗(yàn)?zāi)P托阅?from sklearn.metrics import f1_score, precision_score, recall_scorescore = [] f1 = [] precision = [] recall = [] point=[]for i in range(len(y_test)):if(f1_score(labels[i], y_test[i], average='weighted')>0.6):point.append(i)score.append(f1_score(labels[i], y_test[i], average='weighted'))precision.append(precision_score(labels[i], y_test[i], average='weighted'))recall.append(recall_score(labels[i], y_test[i], average='weighted'))print(len(point)/len(labels)*100) print(np.mean(score)) print(np.mean(precision)) print(np.mean(recall))

輸出結(jié)果:

?

完!?

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Keras实现seq2seq案例代码:Bi-LSTM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。