日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

textCNN初探

發布時間:2023/12/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 textCNN初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 目錄
    • 1.什么是textCNN
      • 1.1 textCNN 提出的背景
      • 1.2 textCNN 合理性分析
    • 2.textCNN相比于傳統圖像領域的CNN有什么特點?
    • 3.textCNN例子講解
      • 3.1 參數和超參數
      • 3.2 textCNN的數據
      • 3.3 textCNN的網絡結構定義
      • 3.4 代碼

目錄

1.什么是textCNN

1.1 textCNN 提出的背景

我們知道,CNN在圖像領域應用的比較好了,那么CNN能不能用于文本分析呢?答案是肯定的。在2014年,Yoon Kim在其論文“Convolutional Neural Networks for Sentence Classification”就提出了使用CNN對文本進行分類。這應該是最早將CNN用于文本分類中的文章了。所以,我們稱將用于文本分析的CNN網絡叫做textCNN。

textCNN的變種

1.2 textCNN 合理性分析

  • 深度學習模型在計算機視覺與語音識別方面取得了卓越的成就. 在 NLP 也是可以的.
  • 卷積具有局部特征提取的功能, 所以可用 CNN 來提取句子中類似 n-gram 的關鍵信息.

2.textCNN相比于傳統圖像領域的CNN有什么特點?

1.相同點:

  • textCNN和傳統的CNN的結構非常類似,都是包含輸入層,卷積層,池化層和最后的輸出層(softmax)等;可用于CNN防止過擬合的措施,如:dropout , BN , early_stop , L1/L2正則化等也都是通用的;
  • 全連接層:全連接層跟其他模型一樣,假設有兩層全連接層,第一層可以上’relu’作為激活函數,第二層則使用softmax激活函數得到屬于每個類的概率。如果處理的數據集為二分類問題,如情感分析的正負面時,第二層也可以使用sigmoid作為激活函數,然后損失函數使用對數損失函數’binary_crossentropy’。

2.創新點:
卷積層:

  • 在處理圖像數據時,CNN使用的卷積核的寬度和高度的一樣的,但是在text-CNN中,卷積核的寬度是與詞向量的維度一致!!!這是因為我們輸入的每一行向量代表一個詞,在抽取特征的過程中,詞做為文本的最小粒度,如果我們使用卷積核的寬度小于詞向量的維度就已經不是以詞作為最小粒度了。
  • 而高度和CNN一樣,可以自行設置(通常取值2,3,4,5),高度就類似于n-gram了。由于我們的輸入是一個句子,句子中相鄰的詞之間關聯性很高,因此,當我們用卷積核進行卷積時,不僅考慮了詞義而且考慮了詞序及其上下文。(類似于skip-gram和CBOW模型的思想)。

池化層:

  • 因為在卷積層過程中我們使用了不同高度的卷積核,使得我們通過卷積層后得到的向量維度會不一致,所以在池化層中,我們使用1-Max-pooling對每個特征向量池化成一個值,即抽取每個特征向量的最大值表示該特征,而且認為這個最大值表示的是最重要的特征。當我們對所有特征向量進行1-Max-Pooling之后,還需要將每個值給拼接起來。得到池化層最終的特征向量。在池化層到全連接層之前可以加上dropout防止過擬合。

3.textCNN例子講解

3.1 參數和超參數

3.2 textCNN的數據

  • 打標簽分類,對每句話進行分類
  • jieba分詞,可以選取的操作,自己添加詞庫和停用詞。
    使用jieba分詞
  • 得到想要的分詞后,進行word2id操作,獲取文本特征
  • shuf 制作好訓練、測試、驗證數據集

3.3 textCNN的網絡結構定義

3.4 代碼

import tensorflow as tf import numpy as npclass TextCNN(object):"""A CNN for text classification.Uses an embedding layer, followed by a convolutional, max-pooling and softmax layer.sequence_length ="""def __init__(self, sequence_length, num_classes, vocab_size,embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0):# 定義模型數據輸出結構 定長的sequence_lengthself.input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x")self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")# Keeping track of l2 regularization loss (optional)l2_loss = tf.constant(0.0)# Embedding layerwith tf.device('/cpu:0'), tf.name_scope("embedding"):self.W = tf.Variable(# 每一個詞都是embedding_size長度的特征向量 (18758,128)tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W")#根據詞的下標,獲取它們的word2vec。#embedded_chars的shape[sequence_length, embedding_size]# (none,56,128) sequence_length = 56self.embedded_chars = tf.nn.embedding_lookup(self.W, self.input_x)#擴充維度 相當于一個1維的通道數# [None,56,128,1]self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)# Create a convolution + maxpool layer for each filter sizepooled_outputs = []for i, filter_size in enumerate(filter_sizes):with tf.name_scope("conv-maxpool-%s" % filter_size):# Convolution Layer# filter_size 分別為3 4 5filter_shape = [filter_size, embedding_size, 1, num_filters]W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")conv = tf.nn.conv2d( # [None,56-3+1,1,128] [None,56-4+1,1,128] [None,56-5+1,1,128]self.embedded_chars_expanded,W,strides=[1, 1, 1, 1],padding="VALID",name="conv")# Apply nonlinearityh = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")# Maxpooling over the outputspooled = tf.nn.max_pool( #[None,1,1,128]h,ksize=[1, sequence_length - filter_size + 1, 1, 1], #[1,54,1,1] [1,53,1,1] [1,52,1,1]strides=[1, 1, 1, 1],padding='VALID',name="pool")print(pooled)pooled_outputs.append(pooled)# Combine all the pooled featuresnum_filters_total = num_filters * len(filter_sizes)self.h_pool = tf.concat(pooled_outputs, 3)self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])# 全連接dropoutwith tf.name_scope("dropout"):self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)# Final (unnormalized) scores and predictionswith tf.name_scope("output"):W = tf.get_variable("W",shape=[num_filters_total, num_classes],initializer=tf.contrib.layers.xavier_initializer())b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")l2_loss += tf.nn.l2_loss(W)l2_loss += tf.nn.l2_loss(b)self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")self.predictions = tf.argmax(self.scores, 1, name="predictions")# Calculate mean cross-entropy losswith tf.name_scope("loss"):losses = tf.nn.softmax_cross_entropy_with_logits(logits=self.scores, labels=self.input_y)self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss# Accuracywith tf.name_scope("accuracy"):correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")

總結

以上是生活随笔為你收集整理的textCNN初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。