热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WSDm问题语义匹配分类算法,SentenceEmbedding实现,自然语言处理

优化版后的网络架构图:参考文献:https:arxiv.orgpdf1808.08762.pdf实现代码(自己修改了一部分,

优化版后的网络架构图:


参考文献:

https://arxiv.org/pdf/1808.08762.pdf

 


实现代码(自己修改了一部分,性能更高):

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 22 12:02:08 2018@author: Lenovo
"""import pandas as pd
from keras.layers import Subtract,Dense,Reshape,BatchNormalization,Lambda,Flatten,Dot,MaxPooling2D,AveragePooling2D,AveragePooling1D,Concatenate,MaxPooling1D,Conv2D,Conv1D,Embedding,CuDNNLSTM,Input,Activation,Multiply,Bidirectional,Dropout
from keras.models import Model,Sequential
from keras.optimizers import SGD,Adam
from keras.callbacks import ModelCheckpoint,EarlyStopping
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils.np_utils import to_categorical
import numpy as np
from data_process import get_data
from keras.utils import plot_model
import matplotlib.pyplot as plt
import keras.backend as K
import tensorflow as tfdef adbsub(x):x1,x2 = xreturn tf.abs(tf.subtract(x1,x2))def calc_01(x):x_1,x_2 = xreturn K.cast(K.equal(x_1,x_2),dtype='float32')def stack_dot_01(x):x_1,x_2 = xreturn K.stack(x,axis=-1)category = ["unrelated","agreed","disagreed"]
#train_x_1,train_x_2,label,vsize,test_x_1,test_x_2,test,train_jiao,test_jiao = get_data()x_1_input = Input(shape=([50]))
x_2_input = Input(shape=([50]))
x_jiao_in = Input(shape=([1]))embedder = Embedding(input_dim=vsize+1, output_dim=300)
x_1_in = embedder(x_1_input)
x_2_in = embedder(x_2_input)
#x_1 = Conv1D(32,3,strides=1,padding='same',activation='relu')(x_1)
#x_2 = Conv1D(32,3,strides=1,padding='same',activation='relu')(x_2)
##x_1 = BatchNormalization()(x_1)
##x_2 = BatchNormalization()(x_2)
###做这个池化 有可能会导致信息失真
#x_1 = MaxPooling1D(pool_size=3,strides=2)(x_1)
#x_2 = MaxPooling1D(pool_size=3,strides=2)(x_2)
#
bilstm_1 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm11 = bilstm_1(x_1_in)
x_1_b_m_1 = MaxPooling1D()(lstm11[0])
lstm12 = bilstm_1(x_2_in)
x_2_b_m_1 = MaxPooling1D()(lstm12[0])
#
bilstm_2 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm21 = bilstm_2(Multiply()([x_1_in,lstm11[0]]))
x_1_b_m_2 = MaxPooling1D()(lstm11[0])
lstm22 = bilstm_2(Multiply()([x_2_in,lstm12[0]]))
x_2_b_m_2 = MaxPooling1D()(lstm12[0])#
bilstm_3 = Bidirectional(CuDNNLSTM(units=150,return_sequences=True,return_state=True))
lstm31 = bilstm_3(Multiply()([x_1_in,lstm21[0]]))
x_1_b_m_3 = MaxPooling1D()(lstm31[0])
lstm32 = bilstm_3(Multiply()([x_2_in,lstm22[0]]))
x_2_b_m_3 = MaxPooling1D()(lstm32[0])x_Concatenate = Concatenate()([x_1_b_m_1,x_2_b_m_1])
x_Subtract = Lambda(adbsub)([x_1_b_m_2,x_2_b_m_2])
x_Multiply = Multiply()([x_1_b_m_3,x_2_b_m_3])
x_m_1 = Concatenate()([x_Concatenate,x_Subtract,x_Multiply])#x_m_2 = Concatenate()([x_2_b_m_1,x_2_b_m_2,x_2_b_m_3])#x_1 = BatchNormalization()(x_1)
#x_2 = BatchNormalization()(x_2)
##
#bilistm_merge = Multiply()([x_1,x_2])
#b_out = Bidirectional(CuDNNLSTM(units=128))(bilistm_merge)
#b_jiao = Bidirectional(CuDNNLSTM(units=128))(bilistm_merge)
#b_out = BatchNormalization()(b_out)
#
#bilstm_2 = Bidirectional(CuDNNLSTM(units=50))
#x_1 = bilstm_2(x_1)
#x_2 = bilstm_2(x_2)
#x_1 = BatchNormalization()(x_1)
#x_2 = BatchNormalization()(x_2)
#
#x_2c = Concatenate(axis=-1)([x_1,x_2])
#x_2c = BatchNormalization()(x_2c)
##
#x_2c = Reshape((2,100,1))(x_2c)
#x_2c = Conv2D(2,kernel_size=(2,3),strides=(1,1),padding='same',activation='relu')(x_2c)
#x_2c = BatchNormalization()(x_2c)
#x_2c = Conv2D(2,kernel_size=(2,3),strides=(1,1),padding='same',activation='relu')(x_2c)
#x_2c = BatchNormalization()(x_2c)
#
#x_2c = AveragePooling2D((2,2),(1,1))(x_2c)
#x_2c = Flatten()(x_2c)
#x_2c = Dense(256,activation='relu')(x_2c)
#print(x_2c.shape)
#x_1 = Reshape((1,100))(x_1)
#x_2 = Reshape((100,1))(x_2)
#x_01 = Lambda(calc_01)([x_1,x_2])
#x_dot = Multiply()([x_1,x_2])
#
#x_dot = Reshape((200,200,1))(x_dot)
#x_01 = Reshape((200,200,1))(x_01)
#
#x = Lambda(stack_dot_01)([x_dot,x_01])
#print(x.shape)
#x = Conv2D(16,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(16,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
##x = AveragePooling2D((2,2),(2,2))(x)
##x = Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
##x = BatchNormalization()(x)
#x = MaxPooling2D((2,2),(2,2))(x)
##
#
x = Flatten()(x_m_1)
x = Dropout(0.5)(x)
##x = BatchNormalization()(x)
##x = Multiply()([x_1,x_2])
##x = Activation('relu')(x)
x = Dense(256,activation='relu')(x)
#x_jiao_in_1 = Dense(5)(x_jiao_in)
#x_jiao_in_1 = Dense(1)(x_jiao_in)
x = Concatenate(axis=1)([x,x_jiao_in])#x = BatchNormalization()(x)
#x = Concatenate(axis=-1)([x,b_out])
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = Conv2D(32,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu')(x)
#x = MaxPooling2D((2,2),(2,2))(x)
#x = Reshape((3,256,1))(x)
#x = Conv2D(3,kernel_size=(3,256),strides=(1,1),padding='valid',activation='relu')(x)
##x = BatchNormalization()(x)
#x = Conv2D(3,kernel_size=(3,256),strides=(1,1),padding='same',activation='softmax')(x)
##x = BatchNormalization()(x)
#out = Reshape(([3]))(x)
#x = Flatten()(x)#x = Dropout(0.2)(x)print('朴实无华网络__很猛')
#x = Concatenate(axis=-1)([x_1,x_2])
#x = Flatten()(x)x = Dropout(0.2)(x)out = Dense(3,activation='softmax')(x)model = Model([x_1_input,x_2_input,x_jiao_in],[out])model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])
model.summary()
plot_model(model,'model.png')
mcp = ModelCheckpoint('wsdm_duoronghe_jiyuci_best.h5',save_best_only=True,monitor='val_acc',verbose=1)
es = EarlyStopping(patience=5,monitor='loss',verbose=1)
cl = [mcp,es]
history = model.fit(x=[train_x_1,train_x_2,train_jiao],y=label,class_weight={0:1,1:5,2:10},batch_size=256,epochs=100,verbose=1,callbacks=cl,validation_split=0.1,shuffle=True)x=history.epoch
y=history.history['acc']
plt.plot(x,y,label="acc")y=history.history['loss']
plt.plot(x,y,label="loss")y=history.history['val_acc']
plt.plot(x,y,label="val_acc")y=history.history['val_loss']
plt.plot(x,y,label="val_loss")result = model.predict(x=[test_x_1,test_x_2])a= np.argmax(result,axis=1)result = pd.DataFrame()
result['Id']=test.id.values
result['Category']=[category[i] for i in a]result.to_csv('submit.csv',index_label=None)

总体架构图:


sentence embedding架构图:


训练呈现:


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 1简介本文结合数字信号处理课程和Matlab程序设计课程的相关知识,给出了基于Matlab的音乐播放器的总体设计方案,介绍了播放器主要模块的功能,设计与实现方法.我们将该设 ... [详细]
author-avatar
zsx2502853407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有