最近在做QA系统,用tensorflow做了些实验,下面的的是一个cnn的评分网络。主要参考了《APPLYING DEEP LEARNING TO ANSWER SELECTION: A STUDY AND AN OPEN TASK》这篇论文与wildml博客中的一篇文章

import tensorflow as tf
import numpy as np
class QaCNN():
def __init__(self , batchsize , sequencesize , vecsize , outsize , filtersizes , num_filters):
self.vecsize = vecsize
self.outsize = outsize
self.batchsize = batchsize
self.sequencesize = sequencesize
self.question = tf.placeholder(tf.float32 , [None , vecsize * sequencesize],name='question')
self.answer_rigth = tf.placeholder(tf.float32 , [None , vecsize * sequencesize],name='answer_right')
self.answer_wrong = tf.placeholder(tf.float32 , [None , vecsize * sequencesize],name='answer_wrong') tenQ = tf.reshape(self.question , [-1 , self.sequencesize , self.vecsize , 1])
tenR = tf.reshape(self.answer_rigth , [-1 , self.sequencesize , self.vecsize , 1])
tenW = tf.reshape(self.answer_wrong , [-1 , self.sequencesize , self.vecsize , 1])
tensorResultQ = []
tensorResultR = []
tensorResultW = []
for i , filtersize in enumerate(filtersizes):
with tf.name_scope("conv-maxpool-%s" % filtersize):
filter_shape = [filtersize, self.vecsize, 1, num_filters]
#W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1),name='W')
W = tf.get_variable(initializer=tf.truncated_normal(filter_shape, stddev=0.1),
name="W-%s" % str(filtersize))
#b = tf.Variable(tf.constant(0.1, shape=[num_filters]),name='b')
b = tf.get_variable(initializer=tf.constant(0.1, shape=[num_filters]),
name="b-%s" % str(filtersize))
pooledQ = self.conv2dPool(tenQ , W , b , filtersize)
pooledR = self.conv2dPool(tenR, W , b , filtersize)
pooledW = self.conv2dPool(tenW , W , b , filtersize)
tensorResultQ.append(pooledQ)
tensorResultR.append(pooledR)
tensorResultW.append(pooledW) flat_length = len(filtersizes) * num_filters
tenQ_flat = tf.reshape(tf.concat(tensorResultQ,3),[-1,flat_length])
tenR_flat = tf.reshape(tf.concat(tensorResultR,3),[-1,flat_length])
tenW_flat = tf.reshape(tf.concat(tensorResultW,3),[-1,flat_length]) exy = tf.reduce_sum(tf.multiply(tenQ_flat , tenR_flat) , 1)
x = tf.sqrt(tf.reduce_sum(tf.multiply(tenQ_flat , tenQ_flat) , 1))
y = tf.sqrt(tf.reduce_sum(tf.multiply(tenR_flat , tenR_flat) , 1))
cosineQR = tf.div(exy , tf.multiply(x , y),name = 'cosineQR') exy = tf.reduce_sum(tf.multiply(tenQ_flat , tenW_flat) , 1)
x = tf.sqrt(tf.reduce_sum(tf.multiply(tenQ_flat , tenQ_flat) , 1))
y = tf.sqrt(tf.reduce_sum(tf.multiply(tenW_flat , tenW_flat) , 1))
cosineQW = tf.div(exy , tf.multiply(x , y),name = 'cosineQW') with tf.name_scope('losses'):
zero = tf.constant(0, shape=[self.batchsize], dtype=tf.float32)
margin = tf.constant(0.05, shape=[self.batchsize], dtype=tf.float32)
self.losses = tf.maximum(zero, tf.subtract(margin, tf.subtract(cosineQR, cosineQW)),name = 'loss_tensor')
self.loss = tf.reduce_sum(self.losses,name='loss')
with tf.name_scope('acc'):
self.correct = tf.equal(zero,self.losses)
self.accuracy = tf.reduce_mean(tf.cast(self.correct , 'float'),name='accuracy')
tf.summary.scalar('loss',self.loss)
self.variable_summaries(self.accuracy)
self.merged = tf.summary.merge_all() def variable_summaries(self , var):
'''Attach a lot of summaries to a Tensor (for TensorBoard visualization).'''
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean',mean)
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev',stddev)
tf.summary.scalar('max',tf.reduce_max(var))
tf.summary.scalar('min',tf.reduce_min(var))
tf.summary.histogram('histogram',var) def conv2dPool(self ,x,W,b,filtersize):
conv = tf.nn.conv2d(x , W , strides =[1,1,1,1],padding='VALID')
h = tf.nn.relu(tf.nn.bias_add(conv ,b))
pooled = tf.nn.max_pool(h,ksize=[1,self.sequencesize - filtersize + 1 , 1, 1],strides=[1,1,1,1],padding='VALID')
return pooled
import numpy as np
import time
import os
import tensorflow as tf
from qacnn_g import *
from process import *
batchsize = 100
sequencesize = 10
vecsize = 200
outsize = 10
root = './lib/'
filtersize = [1,2,3,5]
num_filter = 500
if os.path.exists('./lib/corpus.seg.length.out'):
os.remove(root + 'corpus.seg.length.out')
logfolder = time.strftime("%Y%m%d_%H%M%S", time.localtime())
cnn = QaCNN(batchsize , sequencesize , vecsize , outsize , filtersize , num_filter)
train_step = tf.train.AdamOptimizer(1e-4).minimize(cnn.loss)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
train_writer = tf.summary.FileWriter('./LOGS/'+logfolder,sess.graph)
saver = tf.train.Saver(tf.all_variables())
print ('init...')
dataprocess = DataProcess(root + 'word2vec.bin')
dataprocess.normalize(root + 'corpus.seg.out', root + 'corpus.seg.length.out')
dataprocess.initdata(root + 'corpus.seg.length.out')
start = time.time()
for i in range(120000):
batch =dataprocess.nextbatch(batchsize)#ake_data(batchsize) #fake_data(20, True)
sess.run(train_step ,feed_dict={cnn.question: batch[0],cnn.answer_rigth:batch[1] , cnn.answer_wrong:batch[2]})
if i % 10 == 0:
summary,loss, accuracy,_ = sess.run([cnn.merged , cnn.loss , cnn.accuracy , train_step ] , {cnn.question: batch[0],cnn.answer_rigth:batch[1] , cnn.answer_wrong:batch[2]})
train_writer.add_summary(summary , i)
end = time.time()
elapse = (end - start)
print ('iterator %d.\tloss=%f\taccuracy=%f\telapse=%f'%(i,loss,accuracy,elapse))
start = time.time()
else:
sess.run(train_step ,feed_dict={cnn.question: batch[0],cnn.answer_rigth:batch[1] , cnn.answer_wrong:batch[2]})
train_writer.close()
saver.save(sess , './model/qa.cnn')
sess.close()
print ('end...')

使用了1200W数据来训练,下面是loss的拆线图。

accuracy

使用模型进行打分,这里取了cosineR这个正向答案与问题的cosine值进行度量。

# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
import os
import time
from process import * tf.flags.DEFINE_string('./lib/corpus.out','','Data to predict')
tf.flags.DEFINE_string('checkpoint_dir','./model/','checkpoint directory from training run')
tf.flags.DEFINE_integer('batch_size',1000,'batch size')
tf.flags.DEFINE_string('root','./lib','root dir')
FLAGS = tf.flags.FLAGS
FLAGS._parse_flags()
print ('\nParameters:')
for attr , value in sorted(FLAGS.__flags.items()):
print ('{}={}'.format(attr.upper() , value)) print('') checkpoint_file = tf.train.latest_checkpoint(FLAGS.checkpoint_dir)
dataprocess = DataProcess('./lib/word2vec.bin')
dataprocess.initdata('./lib/corpus.seg.length.out')
graph = tf.Graph()
with graph.as_default():
sess = tf.Session()
with sess.as_default():
saver = tf.train.import_meta_graph('{}.meta'.format(checkpoint_file))
saver.restore(sess , checkpoint_file) start = time.time()
bestAnswer = None
maxScore = -1.0
for i in range(10000):
question = graph.get_operation_by_name('question').outputs[0]
answer_right = graph.get_operation_by_name('answer_right').outputs[0]
answer_wrong = graph.get_operation_by_name('answer_wrong').outputs[0]
loss = graph.get_operation_by_name('losses/loss').outputs[0]
cosineQR = graph.get_operation_by_name('cosineQR').outputs[0]
questionbatch = dataprocess.getSentenceVec('你叫什么名字',10,FLAGS.batch_size)
batchs = dataprocess.nextbatch(FLAGS.batch_size)
cosineQR = sess.run(cosineQR, {question:questionbatch, answer_right:batchs[1],answer_wrong:batchs[2]})
ndx = np.argmax(cosineQR)
score = cosineQR[ndx]
if maxScore < score:
maxScore = score
bestAnswer = batchs[3][ndx]
print ('iterate : %d\tscore:%f\tmaxscore:%f\tanswer:%s'%(i,score,maxScore,(batchs[3][ndx]).strip('\n')))
end = time.time()
print('time used:%f'%(end - start))
print('maxScore:%f'%maxScore)
print('best answer :%s'%bestAnswer)
def find(cosineTensor):
return np.argmax(cosineTensor)

cnn for qa的更多相关文章

  1. QA问答系统,QA匹配论文学习笔记

    论文题目: WIKIQA: A Challenge Dataset for Open-Domain Question Answering 论文代码运行: 首先按照readme中的提示安装需要的部分 遇 ...

  2. (QACNN)自然语言处理:智能问答 IBM 保险QA QACNN 实现笔记

    follow: https://github.com/white127/insuranceQA-cnn-lstm http://www.52nlp.cn/qa%E9%97%AE%E7%AD%94%E7 ...

  3. 自然语言处理:问答 + CNN 笔记

    参考 Applying Deep Learning To Answer Selection: A Study And An Open Task follow: http://www.52nlp.cn/ ...

  4. 敏捷团队中的QA由来

    QA,全称为Quality Analyst,即质量分析师(有些称为Quality Assurance,即质量保证师).为什么它总跟质量扯在一块?感觉这个角色明明做的都是测试的事情,为什么不直接叫做te ...

  5. Deep learning:五十一(CNN的反向求导及练习)

    前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...

  6. 卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别

    由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013+Python2.7.12环境下的C ...

  7. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

  8. CNN车型分类总结

    最近在做一个CNN车型分类的任务,首先先简要介绍一下这个任务. 总共30个类,训练集图片为车型图片,类似监控拍摄的车型图片,训练集测试集安6:4分,训练集有22302份数据,测试集有14893份数据. ...

  9. The difference between QA, QC, and Test Engineering

    Tuesday, March 06, 2007 Posted by Allen Hutchison, Engineering Manager and Jay Han, Software Enginee ...

随机推荐

  1. thymeleaf教程

    本教程涵盖了常见的前端操作,比如,判断,循环,引入模板,常用函数(日期格式化,字符串操作)下拉,js和css中使用,基本可以应对一般场景. 怎么使用? 前端html页面标签中引入如下: <htm ...

  2. 嵌入式开发之gb281818

    http://www.cnblogs.com/snake-hand/p/3157176.html http://blog.csdn.net/voipmaker/article/category/140 ...

  3. 【NOIP模拟题】小象涂色(概率+期望+递推)

    表示数学是个渣... 其实只需要推出每个箱子k次以后的颜色为i的概率就能算出期望了.. 对于区间[l, r]的箱子因为是任意颜色且任意取,所以概率分别为1/c和1/2,那么整体概率就为这两个的乘积.根 ...

  4. xampp默认项目文件夹htdocs

    正确安装好XAMPP后,默认是必须将php程序放到 xampp\htdocs文件夹下才能运行但可以修改.. 参考:http://zhidao.baidu.com/link?url=sY_DPSeGBA ...

  5. java 反序列化漏洞检测及修复

    Jboss.Websphere和weblogic的反序列化漏洞已经出来一段时间了,还是有很多服务器没有解决这个漏洞: 反序列化漏洞原理参考:JAVA反序列化漏洞完整过程分析与调试 这里参考了网上的 J ...

  6. WinForm------如何修改PanelControl控件背景色

    方法: 如何修改panelcontrol背景色 this.bottomPanel.BorderStyle = BorderStyles.NoBorder; this.bottomPanel.Appea ...

  7. JSP内置对象——request 及其响应get和post请求的实例

    request对象客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例.request对象具有请求域,即完成客户端的 ...

  8. 教你在Ubuntu上体验Mac风格

    导读 老实说,我是个狂热的 Ubuntu 迷,我喜欢 Ubuntu 默认的 Unity 主题样式外观.此外,还有很多关于 Ubuntu 14.04 的漂亮图标主题样式 可用来美化默认的外观.但正如我上 ...

  9. Sass之一(基础篇)

    源码链接:http://pan.baidu.com/s/1o8M51hCSass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css ...

  10. HDU3306—Another kind of Fibonacci

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306 题目意思:一个斐波那契数列的变式,本来是A[n]=A[n-1]+A[n-2],现在变成A[n]= ...