一、卷积神经网络(CNN)

复习知识:卷积神经网络(Convolutional Neural Network,CNN)针对全连接网络的局限做出了修正,加入了卷积层(Convolution层)和池化层(Pooling层)。通常情况下,卷积神经网络由若干个卷积层(Convolutional Layer)、激活层(Activation Layer)、池化层(Pooling Layer)及全连接层(Fully Connected Layer)组成。卷积神经网络的组成:

1.卷积层:

卷积层是卷积神经网络的核心所在,通过卷积运算,达到降维处理和提取特征两个重要目的。

2.激活层:

激活层的作用在于将前一层的线性输出,通过非线性的激活函数进行处理,这样用以模拟任意函数,从而增强网络的表征能力。激活层常用的函数包括Sigmoid和ReLU(Rectified-Linear Unit,修正线性单元)等。

3.池化层:

池化层称子采样层或下采样层(Subsampling Layer),作用是降低计算量,提高泛化能力。

4.全连接层:

相当于多层感知机(Multi-Layer Perceptron,简称MLP),其在整个卷积神经网络中起到分类器的作用。

二、textCNN

在2014年提出,Yoon Kim使用了卷积+最大池化这两个在图像领域非常成功的好基友组合。如下图所示,示意图中第一层输入为7*5的词向量矩阵,其中词向量维度为5,句子长度为7,然后第二层使用了3组宽度分别为2、3、4的卷积核,图中每种宽度的卷积核使用了两个。其中每个卷积核在整个句子长度上滑动,得到n个激活值,图中卷积核滑动的过程中没有使用padding,因此宽度为4的卷积核在长度为7的句子上滑动得到4个特征值。然后出场的就是卷积的好基友全局池化了,每一个卷积核输出的特征值列向量通过在整个句子长度上取最大值得到了6个特征值组成的feature map来供后级分类器作为分类的依据。

在《Convolutional Neural Networks for Sentence Classification》中,下图可以加深理解。

三、textCNN实现:用文本卷积实现药品的分类/疾病分类

(1)数据预处理

将药品数据或者疾病数据转化为自己需要的数据样式:

药品数据原始样式:

疾病原始数据样式:

 代码只展示药品数据的处理过程:

标签转化

import pandas as pddf = pd.read_excel('./data/drug_class.xlsx')text_drug = [ i[1] for i in df.values]
labels_drug = [i[0] for i in df.values]def label_turn(label_text):dic_label = dict()for index,label in enumerate(set(label_text)):dic_label[label] = indexreturn dic_labeldic_label = label_turn(labels_drug)

pad过程,将不等长的text文本(即药品名称或者疾病名称)补齐为等长的文本:

def padded(sentences , pad_token): # 转化为等长的句子,补齐'0'sentence = [ list(i) for i in sentences]max_len = len(sentence[0])for i in range(0, len(sentence) - 1):if max_len < len(sentence[i + 1]):max_len = len(sentence[i + 1])i += 1for i in range(0, len(sentence)):for j in range(0, max_len - len(sentence[i])):sentence[i].append(pad_token)print(max_len)return sentencesentences = padded(text_drug , pad_token = '0')

将药品词典转为id:

def vocab_make(sentences):  ##vocab 的制作和编号words = [word for sen in sentences for word in sen]vocab = set(words)dic_vocab = dict()for index,word in enumerate(vocab):dic_vocab[word] = indexreturn vocab,dic_vocabvocab,dic_vocab = vocab_make(sentences)

(2)数据训练过程:

模块导入和参数设置:

import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as Data
import torch.nn.functional as Fdtype = torch.FloatTensor
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# TextCNN Parameter参数设置
embedding_size = 2
sequence_length = len(sentences[0]) # every sentences contains sequence_length(=32) words
num_classes = len(set(labels_drug))  # num_classes=25
batch_size = 10 #每次获取的句子的数量
word2idx = {w: i for i, w in enumerate(vocab)}
vocab_size = len(vocab)

向量转化过程:

def make_data(sentences, labels):inputs = []for sen in sentences:inputs.append([dic_vocab[i] for i in sen])targets = []for out in labels:targets.append(dic_label[out]) # To using Torch Softmax Loss function
#     print(len(inputs),targets)return inputs, targetsinput_batch, target_batch = make_data(sentences, labels_drug)
input_batch, target_batch = torch.LongTensor(input_batch), torch.LongTensor(target_batch)dataset = Data.TensorDataset(input_batch, target_batch)
loader = Data.DataLoader(dataset, batch_size, True)

搭建textCNN框架,训练数据:

class TextCNN(nn.Module):def __init__(self):super(TextCNN, self).__init__()self.W = nn.Embedding(vocab_size, embedding_size)output_channel = 3#卷积层配置self.conv = nn.Sequential(# conv : [input_channel(=1), output_channel, (filter_height, filter_width), stride=1]nn.Conv2d(1, output_channel, (2, embedding_size)),nn.ReLU(),# pool : ((filter_height, filter_width))nn.MaxPool2d((2, 1)),)# fcself.fc = nn.Linear(3*15*1, num_classes)def forward(self, X):'''X: [batch_size, sequence_length]'''batch_size = X.shape[0]embedding_X = self.W(X) # [batch_size, sequence_length, embedding_size]embedding_X = embedding_X.unsqueeze(1) # add channel(=1) [batch, channel(=1), sequence_length, embedding_size]conved = self.conv(embedding_X) # [batch_size, output_channel*1*1]flatten = conved.view(-1, 3*15*1)output = self.fc(flatten)return output
model = TextCNN().to(device)
criterion = nn.CrossEntropyLoss().to(device)
optimizer = optim.Adam(model.parameters(), lr=1e-3)# Training
for epoch in range(1000):for batch_x, batch_y in loader:batch_x, batch_y = batch_x.to(device), batch_y.to(device)pred = model(batch_x)loss = criterion(pred, batch_y)if (epoch + 1) % 100 == 0:print('Epoch:', '%04d' % (epoch + 1), 'loss =', '{:.6f}'.format(loss))optimizer.zero_grad()loss.backward()optimizer.step()

(3)数据预测:

'''predict'''
def padded_pre(sentences , pad_token): # token'<pad>'sentence = [ list(i) for i in sentences]max_len = 32for i in range(0, len(sentence)):for j in range(0, max_len - len(sentence[i])):sentence[i].append(pad_token)return sentence# Test
test_text = '氨曲南'
test_list = [test_text]
#print(test_list)
test_pro = padded_pre(test_list, pad_token = '0')
#print(test_pro)tests = [[dic_vocab[n] for n in test_pro[0]]]
test_batch = torch.LongTensor(tests).to(device)model = model.eval()
predict = model(test_batch).data.max(1, keepdim=True)[1]#打印预测结果
for i in dic_label.keys():if predict[0][0] == dic_label[i]:print(i)

敲黑板:

textCNN进行药品分类和疾病分类,效果非常依赖数据集的维度和训练数据的多少,由于我使用的药品数据最多类(300+)和最少类(20+)两者差距扩大,而我也没有刻意去扩充药品的数据集,所以最后预测的结果准确率还达不到可以实践的程度。但是从另一个角度说,这个模型也是可以去应用实践的,相比于RNN和BERT模型对数据的要求,本模型已经非常良好了,只不过还需要我们花点功夫去整理和扩充数据。

Python 基于卷积神经网络(textCnn)对药品或疾病分类(适用于疾病归一化和药品归一化)相关推荐

  1. 基于卷积神经网络和投票机制的三维模型分类与检索 2019 论文笔记

    作者:白静 计算机辅助设计与图形学学报 1.解决的问题 由于三维模型投影得到的视图是由不同视点得到,具有相对独立性,这种像素级的融合运算并没有直接的物理或者几何意义,更有可能造成图像有益信息淹没和混淆 ...

  2. 基于卷积神经网络的不良地质体识别与分类

    在泛函分析中,卷积.旋积或摺积(英语:Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分的面积. 如果将参加卷积的一个函数看作区间的 ...

  3. MXNet中使用卷积神经网络textCNN对文本进行情感分类

    在图像识别领域,卷积神经网络是非常常见和有用的,我们试图将它应用到文本的情感分类上,如何处理呢?其实思路也是一样的,图片是二维的,文本是一维的,同样的,我们使用一维的卷积核去处理一维的文本(当作一维的 ...

  4. 基于卷积神经网络的乳腺肿瘤良恶性分类方法研究

    一.创新点: 1.多中心数据处理方法 2.将原始的网络模型的 sofmax 分类器替换成 SVM(主要是将softmax 分类器所用的交叉熵损失函数替换成 SVM 的 hinge loss 形式的损失 ...

  5. 论文翻译:基于深度卷积神经网络的肉鸡粪便识别与分类

    Recognition and Classification of Broiler Droppings Based on Deep Convolutional Neural Network 基于深度卷 ...

  6. 基于Python的卷积神经网络和特征提取

     基于Python的卷积神经网络和特征提取 发表于2015-08-27 21:39| 4577次阅读| 来源blog.christianperone.com/| 13 条评论| 作者Christi ...

  7. Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)

    项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现交通标志识别.搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的 ...

  8. 【数据挖掘】基于卷积神经网络的非侵入式负荷分解(NILM)Python实现

    本方法主要利用基于卷积神经网络的非侵入式负荷分解方法实现住宅设备的识别,输入数据为在设备运行时获得的瞬态功率信号数据.训练卷积神经网络使用数据为开源数据REDD(1Hz),具体实现原理请参考文献下载链 ...

  9. python人脸识别系统界面设计_基于卷积神经网络的人脸识别系统的设计(Python)

    基于卷积神经网络的人脸识别系统的设计(Python)(论文10000字,外文翻译,参考代码,流程图,人脸图像库) 摘要:随着社会的进步与发展,个人信息的保护变得十分重要.传统的密码保护方式已经不再满足 ...

最新文章

  1. [原创]java WEB学习笔记02:javaWeb开发的目录结构
  2. Oracle SQL语句大全(三)
  3. 担忧医生因AI技术而失业?杞人忧天
  4. 想系统化提升自己产品能力,就要读这些书籍
  5. 【推荐】飞鸽传书2013官方下载
  6. 【STM32】手把手固件库开发工程建立
  7. 【SpringMVC】SpringMVC: @RequestBody 和@ResponseBody 注解详解 NoHandlerFoundException
  8. java日期加一天_Java 关于日期加一天(日期往后多一天)
  9. eclipse下的webservice开发
  10. 阿里P7跳槽后曝光薪资截图:新公司月入税后五万多,很满足!
  11. 20200816每日一句
  12. iMX6ULL u-boot2021.04移植
  13. matlab中readwav的用法,使用matlab的wavread函数总提示出错,那位高手指点下啊
  14. 英文缩写400个速查
  15. NIVIDIA Tegra K1 QWT安装使用问题和解决办法
  16. Mac软件无响应怎么办?
  17. crosstab交叉表_用Python统计推断——交叉表篇(上:crosstab与热图)
  18. 爬取北京链家二手房数据
  19. SQL优化 - Group By 导致的慢sql
  20. 情不知所起,无以而终

热门文章

  1. Java 找出1000以内所有的完数
  2. win2012命令计算机,Windows2012重启的两种方法:cmd命令关机重启分享
  3. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)
  4. STM32定时器中断进去了出不来不能执行主函数
  5. 一个基于BCH的付费电驴下载的设想
  6. fatal error C1083: 无法打开预编译头文件 的解决方法
  7. 视通科技车载应急指挥调度解决方案
  8. 微信端活体检测|人脸识别SDK|人证比对|身份核验
  9. 计算机网络期末复习总结
  10. 2017 码云最火爆开源项目 TOP 50,你都用过哪些 – 坏~牧羊人 – 博客园