R语言用Keras长短期记忆LSTM神经网络分类分析问答文本数据

最近我们被客户要求撰写关于神经网络的研究报告,包括一些图形和统计输出。

介绍

本文是在 R 中使用 Keras 的LSTM神经网络分类简单介绍。

软件包

library(tidyverse) #导入、清理、可视化 
library(keras) # 用keras进行深度学习
library(data.table) # 快速读取csv数据

导入

让我们看一下数据


tst %>% head()

初步查看

让我们考虑几个 用户可能提出的“不真诚”问题的例子

trn %>% filter(tart == 1) %>% sme_n(5)

我可以理解为什么这些问题被认为是“不真诚的”:它们不是在寻求真正的答案,而是倾向于将提问者的信念陈述为事实,或者试图故意挑衅。想知道我们的模型会怎么样?

标记化

让我们从标记句子开始。

# 设置一些参数

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 # 没有嵌入的词都是零
  }

模型架构

我们从一个简单的 LSTM 开始,顶层有一个用于预测的密集层。

# 设置输入

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,注意不要过度拟合。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值