深度学习框架Keras介绍及实战
Keras 是一個(gè)用 Python 編寫的高級(jí)神經(jīng)網(wǎng)絡(luò) API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運(yùn)行。Keras 的開發(fā)重點(diǎn)是支持快速的實(shí)驗(yàn)。能夠以最小的時(shí)延把你的想法轉(zhuǎn)換為實(shí)驗(yàn)結(jié)果,是做好研究的關(guān)鍵。
本文以Kaggle上的項(xiàng)目:IMDB影評(píng)情感分析為例,學(xué)習(xí)如何用Keras搭建一個(gè)神經(jīng)網(wǎng)絡(luò),處理實(shí)際問(wèn)題.閱讀本文需要對(duì)神經(jīng)網(wǎng)絡(luò)有基礎(chǔ)的了解.
文章分為兩個(gè)部分:
- Keras中的一些基本概念.Api用法.我會(huì)給出一些簡(jiǎn)單的使用樣例,或是給出相關(guān)知識(shí)鏈接.
- IMDB影評(píng)情感分析實(shí)戰(zhàn).用到的都是第一部分中講到的知識(shí)點(diǎn).
Model
Dense 全連接層
keras.layers.core.Dense(units, activation=None, use_bias=True, k
ernel_initializer='glorot_uniform', bias_initializer='zeros', ke
rnel_regularizer=None, bias_regularizer=None, activity_regulariz
er=None, kernel_constraint=None, bias_constraint=None)
嵌入層 Embedding
keras.layers.embeddings.Embedding(input_dim, output_dim, embeddi
ngs_initializer='uniform', embeddings_regularizer=None, activity
_regularizer=None, embeddings_constraint=None, mask_zero=False,
input_length=None)
有興趣的看這個(gè)鏈接https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/
其實(shí)就是word to vector。 這一層的作用就是得到用詞向量表示的文本.
- input_dim: 詞表的大小.即不同的詞的總個(gè)數(shù).
- output_dim:想要把詞轉(zhuǎn)換成多少維的向量.
- input_length: 每一句的詞的個(gè)數(shù)
比如如下代表:我們輸入一個(gè)M*50的矩陣,這個(gè)矩陣中不同的詞的個(gè)數(shù)為200,我們想把每個(gè)詞轉(zhuǎn)換為32維向量. 返回的是一個(gè)(M,50,32)的張量.
一個(gè)句子50個(gè)詞,每個(gè)詞是32維向量,共M個(gè)句子. 所以是e.shape=(M,50,32)
e = Embedding(200, 32, input_length=50)
LSTM層.
LSTM是循環(huán)神經(jīng)網(wǎng)絡(luò)的一種特殊情況.http://deeplearning.net/tutorial/lstm.html
簡(jiǎn)單來(lái)說(shuō),我們此前說(shuō)過(guò)的神經(jīng)網(wǎng)絡(luò),包括CNN,都是單向的,沒有考慮序列關(guān)系,但是某個(gè)詞的意義與其上下文是有關(guān)的,比如"我用著小米手機(jī),吃著小米粥",兩個(gè)小米肯定不是一個(gè)意思.在做語(yǔ)義分析的時(shí)候,需要考慮上下文. 循環(huán)神經(jīng)網(wǎng)絡(luò)RNN就是干這個(gè)事情的.或者說(shuō)"這部電影質(zhì)量很高,但是我不喜歡".這個(gè)句子里既有正面評(píng)價(jià),又有負(fù)面評(píng)價(jià),參考上下文的LSTM會(huì)識(shí)別出"但是"后面的才是我們想要重點(diǎn)表達(dá)的.
keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_
activation='hard_sigmoid', use_bias=True, kernel_initializer='gl
orot_uniform', recurrent_initializer='orthogonal', bias_initiali
zer='zeros', unit_forget_bias=True, kernel_regularizer=None, rec
urrent_regularizer=None, bias_regularizer=None, activity_regular
izer=None, kernel_constraint=None, recurrent_constraint=None, bi
as_constraint=None, dropout=0.0, recurrent_dropout=0.0)
池化層
- keras.layers.pooling.GlobalMaxPooling1D() #對(duì)時(shí)間信號(hào)的全局最大池化 https://stackoverflow.com/questions/43728235/what-is-the-difference-between-keras-maxpooling1d-and-globalmaxpooling1d-functi
- input:形如( samples, steps, features) 的3D張量
- output:形如(samples, features)的2D張量
- keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, pad
ding='valid') - keras.layers.pooling.MaxPooling2D(pool_size=(2, 2), strides=None
, padding='valid', data_format=None) - keras.layers.pooling.MaxPooling3D(pool_size=(2, 2, 2), strides=N
one, padding='valid', data_format=None) - ....
數(shù)據(jù)預(yù)處理
文本預(yù)處理
- keras.preprocessing.text.text_to_word_sequence(text,
filters=base_filter(), lower=True, split=" ") - keras.preprocessing.text.one_hot(text, n,
filters=base_filter(), lower=True, split=" ") - keras.preprocessing.text.Tokenizer(num_words=None, filters=base_
filter(),
lower=True, split=" ")
Tokenizer是一個(gè)用于向量化文本, 或?qū)⑽谋巨D(zhuǎn)換為序列( 即單詞在字典中的下標(biāo)構(gòu)
成的列表, 從1算起) 的類。- num_words: None或整數(shù), 處理的最大單詞數(shù)量。 若被設(shè)置為整數(shù), 則分詞器
將被限制為處理數(shù)據(jù)集中最常見的 num_words 個(gè)單詞 - 不管num_words是幾,fit_on_texts以后詞典都是一樣的,全部的詞都有對(duì)應(yīng)的index.只是在做texts_to_sequences時(shí)所得結(jié)果不同.
- 會(huì)取最常出現(xiàn)的(num_words - 1)個(gè)詞對(duì)應(yīng)的index來(lái)代表句子.
- 注意num_words不同時(shí),準(zhǔn)換后X_t的不同. 只取詞典中出現(xiàn)最多的num_words - 1代表句子.如果一個(gè)句子中出現(xiàn)特別生僻的詞,就會(huì)被過(guò)濾掉.比如一個(gè)句子="x y z".y,z不在詞典中最常出現(xiàn)的top num_words-1的話,最后這個(gè)句子的向量形式則為[x_index_in_dic]
- num_words: None或整數(shù), 處理的最大單詞數(shù)量。 若被設(shè)置為整數(shù), 則分詞器
序列預(yù)處理
- keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None
, dtype='int32',
padding='pre', truncating='pre', value=0.)
返回一個(gè)2階張量 - keras.preprocessing.sequence.skipgrams(sequence, vocabulary_size
,
window_size=4, negative_samples=1., shuffle=True,
categorical=False, sampling_table=None) - keras.preprocessing.sequence.make_sampling_table(size, sampling_
factor=1e-5)
keras實(shí)戰(zhàn):IMDB影評(píng)情感分析
數(shù)據(jù)集介紹
- labeledTrainData.tsv/imdb_master.csv 影評(píng)數(shù)據(jù)集 已經(jīng)標(biāo)注對(duì)電影是正面/負(fù)面評(píng)價(jià)
- testData.tsv 測(cè)試集 需要預(yù)測(cè)評(píng)論是正面/負(fù)面
主要步驟
- 數(shù)據(jù)讀取
- 數(shù)據(jù)清洗 主要包括去除停詞,去除html tag,去除標(biāo)點(diǎn)符號(hào)
- 模型構(gòu)建
- 嵌入層:完成詞到向量的轉(zhuǎn)換
- LSTM
- 池化層:完成重要特征抽取
- 全連接層:分類
數(shù)據(jù)加載
import pandas as pd import matplotlib.pyplot as plt import numpy as np df_train = pd.read_csv("./dataset/word2vec-nlp-tutorial/labeledTrainData.tsv", header=0, delimiter="\t", quoting=3) df_train1=pd.read_csv("./dataset/imdb-review-dataset/imdb_master.csv",encoding="latin-1") df_train1=df_train1.drop(["type",'file'],axis=1) df_train1.rename(columns={'label':'sentiment','Unnamed: 0':'id','review':'review'}, inplace=True) df_train1 = df_train1[df_train1.sentiment != 'unsup'] df_train1['sentiment'] = df_train1['sentiment'].map({'pos': 1, 'neg': 0}) new_train=pd.concat([df_train,df_train1])數(shù)據(jù)清洗
用bs4處理html數(shù)據(jù)
- 過(guò)濾出單詞
- 去除停用詞
Keras搭建網(wǎng)絡(luò)
文本轉(zhuǎn)換為矩陣
- Tokenizer作用于list(sentence)得到詞典.將詞用詞在詞典中的Index做替換,得到數(shù)字矩陣
- pad_sequences做補(bǔ)0. 保證矩陣每一行數(shù)目相等. 即每個(gè)句子有相同數(shù)量的詞.
模型構(gòu)建
- 詞轉(zhuǎn)向量
- LSTM 60個(gè)神經(jīng)元
- GlobalMaxPool1D 相當(dāng)于抽取出最重要的神經(jīng)元輸出
- DropOut 丟棄部分輸出 引入正則化,防止過(guò)擬合
- Dense 全連接層
- 模型編譯時(shí)指定損失函數(shù),優(yōu)化器,模型效果評(píng)測(cè)標(biāo)準(zhǔn)
- 模型訓(xùn)練
- 使用模型預(yù)測(cè)
轉(zhuǎn)載于:https://www.cnblogs.com/sdu20112013/p/10428471.html
總結(jié)
以上是生活随笔為你收集整理的深度学习框架Keras介绍及实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 超便携笔记本小电脑(超便携笔记本小电脑哪
- 下一篇: 人的命运是天注定的吗(宿命论的观点是不正