原文链接:http://tecdat.cn/?p=26709
介绍
本文是在 R 中使用 Keras 的LSTM神经网络分类简单介绍。
软件包
library(tidyverse) #导入、清理、可视化 library(keras) # 用keras进行深度学习 library(data.table) # 快速读取csv数据
导入
让我们看一下问答文本数据(查看文末了解数据获取方式)
tst %>% head()
初步查看
让我们考虑几个 用户可能提出的“不真诚”问题的例子
trn %>% filter(tart == 1) %>% sme_n(5)
我可以理解为什么这些问题被认为是“不真诚的”:它们不是在寻求真正的答案,而是倾向于将提问者的信念陈述为事实,或者试图故意挑衅。想知道我们的模型会怎么样?
点击标题查阅往期内容
Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
01
02
03
04
标记化
让我们从标记句子开始。
# 设置一些参数 mx_s <- 15000 # 考虑作为特征的最大词数 mxen <- 64 # 在n个词之后的文本截断 # 准备对文本进行标记 ful <- rbind(tin %>% select(qon\_t), test %>% select(quin\_ext)) tts <- full$qesio_tx toer <- text\_tokenizer(nu\_ors = m_wods) %>% >。 fi\_txt\_ner(txt # 符号化 - 即把文本转换成整数序列 seqnces <- tts_tseecs(toenze, txts) rd_idex <- toker$wordiex # 垫出文本,使所有内容都是相同的长度 daa = pad_sques(quecs, maxlen = aln)
数据拆分
# 分割回训练和测试 tri_mrx = data\[1:nrow(tan),\] # 分割回训练和测试。 ttmix = da\[(nrow(ran)+1):nrow(at),\] # 准备训练标签。 # 准备好训练标签 laes = trin$trgt # 准备一个验证集 set.seed(1337) traingsales = nrow(trinix)*0.90 inie = sample(1:nrow(tra_trix)) trining\_idies = indices\[1:training\_samples\] 。 valdaton\_inces = indices\[(ranng\_sples + 1): (trningmes + vliiopls)\] 。 xtrin = tainmax\[trinig_dces,\] 。 y_an = labels\[ainginies\] x\_vl = traimarix\[valito\_inces,\] y_val = labels\[traginces\]。 y_al = labels\[vlitnidies\]。 # 训练维度 dim(x_ran) table(y_tan)
这里非常严重的不平衡,我们需要稍后解决这个问题。
嵌入
我们的第一个模型将基于一个提供的词嵌入。我们从较小的嵌入文件开始。
lis <- readLines('1M.vec') fsti_emedisndx = nw.ev(hash = TRUE, parent = eptev()) ies <- lns\[2:legt(lie)\] b <- tPrgssBr(min = 0, max = lenth(lns), style = 3) for (i in 1:length(les)){ vaus <- strsplit(le, " ")\[\[1\]\] wd<- vaus\[\[1\]\] fsiemgndx\[\[word\]\] = as.double(vaes\[-1\]) etxPressar(pb, i) } # 创建我们的嵌入矩阵 faikimbddngim = 300 fawkiebiix = array(0, c(mx\_ords, faii\_mdig_m)) for (wrd in names(wrddex)){ idx <- wr_dx\[\[od\]\] if (nex < ma_ds){ faiki\_embdg\_vctor =astwkedgdex\[\[word\]\] if (!is.null(fasiembddigveor)) fatwki\_bednrix\[iex+1,\] <- faswiiedin\_vor # 没有嵌入的词都是零 }
inpt <- layput( shape = list(NULL), # 模型层 embding <- input %>% layeing(input\_dim = maords, output\_dim = fasing_dim, name = "embedding") lstm <- eming %>% layer_lstm(units = maxn,drout = 0.25, recudroput = 0.25, reseques = FALSE, name = "lstm") dese <- lstm %>% ladese(units = 128, actin = "rlu", name = "dese") # 把模型集中起来 mol <- kmoel(input, preds) # 最初冻结嵌入权重,以防止更新的权重回传,破坏我们的嵌入。 getlar(ml, name = "embedding") %>% sehts(list(fasatrix)) %>% frehts() # 编译 print(model)
模型训练
保持对初始基准模型的快速训练。
# 训练模型 history <- model %>% fit( x_train, y_train, # 看看训练结果 print(hisy)
模型可以很容易地通过微调来改进:只需嵌入层并再训练模型几个 epoch,注意不要过度拟合。