一、搭建简单的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)的更多相关文章

  1. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  2. 用CRF++开源工具做文本序列标注教程

    本文只介绍如何快速的使用CRF++做序列标注,对其中的原理和训练测试参数不做介绍. 官网地址:CRF++: Yet Another CRF toolkit 主要完成如下功能: 输入 -> &qu ...

  3. 序列标注(HMM/CRF)

    目录 简介 隐马尔可夫模型(HMM) 条件随机场(CRF) 马尔可夫随机场 条件随机场 条件随机场的特征函数 CRF与HMM的对比 维特比算法(Viterbi) 简介 序列标注(Sequence Ta ...

  4. BiLSTM:序列标注任务的标杆

    Bidirectional LSTM-CRF Models for Sequence Tagging. Zhiheng Huang. 2015 在2015年,本文第一个提出使用BiLSTM-CRF来做 ...

  5. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  6. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

  7. TensorFlow教程——Bi-LSTM+CRF进行序列标注(代码浅析)

    https://blog.csdn.net/guolindonggld/article/details/79044574 Bi-LSTM 使用TensorFlow构建Bi-LSTM时经常是下面的代码: ...

  8. 序列标注(BiLSTM-CRF/Lattice LSTM)

    前言 在三大特征提取器中,我们已经接触了LSTM/CNN/Transormer三种特征提取器,这一节我们将介绍如何使用BiLSTM实现序列标注中的命名实体识别任务,以及Lattice-LSTM的模型原 ...

  9. Bi-LSTM+CRF在文本序列标注中的应用

    传统 CRF 中的输入 X 向量一般是 word 的 one-hot 形式,前面提到这种形式的输入损失了很多词语的语义信息.有了词嵌入方法之后,词向量形式的词表征一般效果比 one-hot 表示的特征 ...

随机推荐

  1. SpringBoot与任务

    (1).异步任务 package cn.coreqi; import org.springframework.boot.SpringApplication; import org.springfram ...

  2. MFC_CFileDialog_选择文件夹

    场景 在MFC中有时候只需要选择一个文件夹而不需要选择文件,这时候可以通过下列方式来进行选择 技术点 BROWSEINFO typedef struct_browseinfo { HWND hwndO ...

  3. 通过全备+主从同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步(本文)] 伪master+Binlog+同 ...

  4. oracle查询重复数据方法

    SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peop ...

  5. HTML学习笔记05-文本格式化

    HTML格式化标签 HTML使用标签<b>与<i>对输出的文本进行格式,如:粗体or斜体 这些HTML标签称为格式化标签 <!DOCTYPE HTML> <h ...

  6. STM32学习及应用笔记二:一次运算符优先级造成的错误

    本人在最近一个项目的开发中,出现一个应为疏忽运算符优先级造成的问题,检查了很久才发现问题,所以觉得运算符的优先级问题还是有必要再研究一下.具体的问题是这样的,我采集了传感器的原始数据,然后会对数据进行 ...

  7. vue路径优化之resolve

    通过vue-cli来创建vue+webpack的项目时,已经有很多都配置好了,但是路径方面为了方便开发,还可以优化. 1. resolve.extensions 在webpack.base.conf. ...

  8. Java集合(Collection)综述

    1.集合简介 数学定义:一般地,我们把研究对象统称为元素.把一些元素组成的总体叫做集合. java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器. java中通用集合类存放于jav ...

  9. PHP数组序列化和反序列化

    PHP序列化在我们实际项目运行过程中是一种非常常见的操作.比如当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类 ...

  10. pytest一:pytest 框架介绍

    pytest 是 python 的一种单元测试框架,与python 自带的 unittest测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高.根据pytest 的官方网站介绍,它具 ...