热门标签 | 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架构图:


训练呈现:


推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 优化后的摘要:本文详细分析了当前面临的挑战和机遇,结合具体实例探讨了如何通过创新和改革来推动长期可持续发展。文中还介绍了多种可行的解决方案,并强调了在不同阶段实施这些方案的重要性。 ... [详细]
  • 由中科院自动化所、中科院大学及南昌大学联合研究提出了一种新颖的双路径生成对抗网络(TP-GAN),该技术能通过单一侧面照片生成逼真的正面人脸图像,显著提升了不同姿态下的人脸识别效果。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
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社区 版权所有