CNN做序列标注问题(tensorflow)
一、搭建简单的CNN做序列标注代码
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt TIME_STEPS = 15# backpropagation through time 的time_steps
BATCH_SIZE = 1#50
INPUT_SIZE = 1 # x数据输入size
LR = 0.05 # learning rate
num_tags = 2
# 定义一个生成数据的 get_batch function:
def get_batch():
xs = np.array([[[[2], [3], [4], [5], [5], [5], [1], [5], [3], [2], [5], [5], [5], [3], [5]]]])
res = np.array([[0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1]])
ys = np.zeros([1,TIME_STEPS,2])
for i in range(TIME_STEPS):
if(res[0,i] == 0):
ys[0,i,0] = 1
ys[0,i,1] = 0
else:
ys[0,i,0] = 0
ys[0,i,1] = 1 return [xs, res,ys] # 定义 CNN 的主体结构
class CNN(object):
def __init__(self, n_steps, input_size, num_tags, batch_size):
self.n_steps = n_steps
self.input_size = input_size
self.num_tags = num_tags
self.batch_size = batch_size
#卷积神将网络的输入:[batch, in_height, in_width, in_channels],在自然语言处理中height为1
self.xs = tf.placeholder(tf.float32, [self.batch_size,1, self.n_steps, self.input_size], name='xs')
#做序列标注,第二维对应好输入的n_steps,相当于每个时刻的输入都有一个输出
self.ys = tf.placeholder(tf.int32, [self.batch_size, self.n_steps,self.num_tags], name='ys')# self.featureNum = 10#提取10个特征 #[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]
W_conv1 = self.weight_variable([1,3,1,self.featureNum])#提取10个特征
#对应10个卷积核输出
b_conv1 = self.bias_varibale([self.featureNum]) #卷积操作
layer_conv1 = tf.nn.conv2d(self.xs, W_conv1,strides=[1, 1, 1, 1],padding="SAME",) + b_conv1
#激励层
layer_conv1 = tf.nn.relu(layer_conv1)
#最大值池化 本处去除池化层为了后续计算简便
#layer_pool1 = tf.nn.max_pool(layer_conv1,
# [1, 1, 3, 1],[1,1,1,1],padding='VALID')
layer_pool1 = layer_conv1 # 全连接层 映射到self.n_steps x self.num_tags
layer_pool1 = tf.reshape(layer_pool1,[self.n_steps,self.featureNum])
W_fc1 = self.weight_variable([self.featureNum,self.num_tags])
b_fc1 = self.bias_varibale([self.num_tags])
h_fc1 = tf.matmul(layer_pool1, W_fc1) + b_fc1
#激励层
h_fc1 = tf.nn.relu(h_fc1)
#softmax 归一化
self.y_conv = tf.nn.softmax(h_fc1)
self.label = tf.reshape(self.ys,[self.n_steps,2])
self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.label, logits=self.y_conv))
#梯度下降
self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)
self.pred = tf.argmax(self.y_conv,axis = 1) def weight_variable(self,shape):
initial=tf.truncated_normal(shape, mean=0.0, stddev=0.1)
return tf.Variable(initial)
def bias_varibale(self,shape):
initial=tf.constant(0,1,shape=shape)
return tf.Variable(initial) # 训练CNN
if __name__ == '__main__': # 搭建 CNN 模型
model = CNN(TIME_STEPS, INPUT_SIZE, num_tags, BATCH_SIZE)
sess = tf.Session()
sess.run(tf.global_variables_initializer()) # matplotlib可视化
plt.ion() # 设置连续 plot
plt.show()
# 训练多次
for i in range(150):
xs, res,ys = get_batch() # 提取 batch data
# 初始化 data
feed_dict = {
model.xs: xs,
model.ys: ys,
}
# 训练
_, cost,pred = sess.run(
[model.train_op, model.cost, model.pred],
feed_dict=feed_dict) # plotting x = xs.reshape(-1,1)
r = res.reshape(-1, 1)
p = pred.reshape(-1, 1) x = range(len(x)) plt.clf()
plt.plot(x, r, 'r', x, p, 'b--')
plt.ylim((-1.2, 1.2))
plt.draw()
plt.pause(0.3) # 每 0.3 s 刷新一次 # 打印 cost 结果
if i % 20 == 0:
print('cost: ', round(cost, 4))
得到结果:
二、CNN主要知识点
待整理。
CNN做序列标注问题(tensorflow)的更多相关文章
- DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别
三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...
- 用CRF++开源工具做文本序列标注教程
本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍. 官网地址:CRF++: Yet Another CRF toolkit 主要完成如下功能: 输入 -> &qu ...
- 序列标注(HMM/CRF)
目录 简介 隐马尔可夫模型(HMM) 条件随机场(CRF) 马尔可夫随机场 条件随机场 条件随机场的特征函数 CRF与HMM的对比 维特比算法(Viterbi) 简介 序列标注(Sequence Ta ...
- BiLSTM:序列标注任务的标杆
Bidirectional LSTM-CRF Models for Sequence Tagging. Zhiheng Huang. 2015 在2015年,本文第一个提出使用BiLSTM-CRF来做 ...
- TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载
http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...
- 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)
http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...
- TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)
https://blog.csdn.net/guolindonggld/article/details/79044574 Bi-LSTM 使用TensorFlow构建Bi-LSTM时经常是下面的代码: ...
- 序列标注(BiLSTM-CRF/Lattice LSTM)
前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...
- Bi-LSTM+CRF在文本序列标注中的应用
传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...
随机推荐
- android fragment解析
1.fragment加载到Activity (1).添加fragment到Activity的布局文件 (2).动态在activity中添加fragment 例子: // 步骤1:获取FragmentM ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- 常见的移动端Web页面问题
移动端Web需要照顾触摸操作的体验,以及更多的屏幕旋转与尺寸适配等问题,非常琐碎,在这里为大家倾力总结多条常见的移动端Web页面问题解决方案,欢迎收看收藏! 1.安卓浏览器看背景图片,有些设备会模糊 ...
- TYpeScript接口的使用
1.接口中的属性值的使用: // 作用是强制类型检查 interface Iperson { name: string; age: string; } class Person { construct ...
- (并发编程)线程 (理论-创建-lock-属性-守护,与进程的对比)
一.线程理论1.什么是线程 线程指的是一条流水线的工作过程(执行代码) 进程不是执行单位,是资源单位 一个进程内自带一个线程,线程是执行单位 2.进程VS线程 1.同一进程内的线程们 ...
- Spring事务回滚和异常类
1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable.Error和RuntimeException及其子类成为未检查异常( ...
- 最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解
一.什么是CocoaPods 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm.随着 iOS 开发者的增多,业界也出现了为 iOS 程序 ...
- 目标检测--SSD: Single Shot MultiBox Detector(2015)
SSD: Single Shot MultiBox Detector 作者: Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, ...
- Http请求中请求头Content-Type讲解
在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 Med ...
- 1、Appium安装
1.安装node.js 访问node js官网 https://nodejs.org/en/ 下载并安装node js,找到你系统适合的node js一步步安装即可 2.安装Appium 在cmd中执 ...