當前位置:
首頁 > 知識 > 手把手教你用 TensorFlow 實現文本分類(下)

手把手教你用 TensorFlow 實現文本分類(下)

本篇文章主要記錄對之前用神經網路做文本識別的初步優化,進一步將準確率由原來的65%提高到80%,這裡優化的幾個方面包括:

隨機打亂訓練數據

增加隱層,和驗證集

正則化

對原數據進行PCA預處理

調節訓練參數(迭代次數,batch大小等)

隨機化訓練數據

觀察訓練數據集,發現訓練集是按類別存儲,讀進內存後在仍然是按類別順序存放。這樣順序取一部分作為驗證集,很大程度上會減少一個類別的訓練樣本數,對該類別的預測準確率會有所下降。所以首先考慮打亂訓練數據。

在已經向量化的訓練數據的基礎上打亂數據,首先合并data和label,打亂後再將數據和標籤分離為trian.txt和train_label.txt。這裡可以直接使用shell命令:

1、將labels加到trian.txt的第一列

paste -d" " train_labels.txt train.txt > train_to_shuf.txt

2、隨機打亂文件行

shuf train_to_shuf.txt -o train.txt

3、 提取打亂後文件的第一列,保存到train_labels.txt

cat train.txt | awk > train_labels.txt

4、刪除第一列label.

awk {$1="";print $0} train.txt

這樣再次以相同方式訓練,準確率由65%上升到75% 。

改變網路結構,增加隱層

之前的網路直接對輸入數據做softmax回歸,這裡考慮增加隱層,數量並加入驗證集觀察準確率的變化情況。這裡加入一個隱層,隱層節點數為500,激勵函數使用Relu。替換原來的網路結構,準確率進一步上升。

正則化,改善過擬合

觀察模型對訓練集的擬合程度到90%+,而通過上步對訓練數據的準確率為76%,一定程度上出現了過擬合的現象,這裡在原有cost function中上加入正則項,希望減輕過擬合的現象。這裡使用L2正則。連同上步部分的代碼如下:

#!/usr/bin/python

#-*-coding:utf-8-*-

LAYER_NODE1 = 500 # layer1 node num

INPUT_NODE = 5000

OUTPUT_NODE = 10

REG_RATE = 0.01

import tensorflow as tf

from datasets import datasets

def interface(inputs, w1, b1, w2,b2):

"""

compute forword progration result

"""

data_sets = datasets()

data_sets.read_train_data(".", True)

sess = tf.InteractiveSession()

x = tf.placeholder(tf.float32, [None, INPUT_NODE], name="x-input")

y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name="y-input")

w1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER_NODE1], stddev=0.1))

b1 = tf.Variable(tf.constant(0.0, shape=[LAYER_NODE1]))

w2 = tf.Variable(tf.truncated_normal([LAYER_NODE1, OUTPUT_NODE], stddev=0.1))

b2 = tf.Variable(tf.constant(0.0, shape=[OUTPUT_NODE]))

y = interface(x, w1, b1, w2, b2)

cross_entropy = -tf.reduce_sum(y_ * tf.log(y + 1e-10))

regularization = regularizer(w1) + regularizer(w2)

loss = cross_entropy + regularization

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

#training

tf.global_variables_initializer().run()

saver = tf.train.Saver()

cv_feed =

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

for i in range(5000):

if i % 200 == 0:

cv_acc = sess.run(acc, feed_dict=cv_feed)

print "train steps: %d, cv accuracy is %g " % (i, cv_acc)

train_step.run()

path = saver.save(sess, "./model4/model.md")

PCA處理

一方面對文本向量集是嚴重稀疏的矩陣,而且維度較大,一方面影響訓練速度,一方面消耗內存。這裡考慮對數據進行PCA處理。該部分希望保存99%的差異率,得到相應的k,即對應的維度。

#!/usr/bin/python

#-*-coding:utf-8-*-

"""

PCA for datasets

"""

import os

import sys

import commands

import numpy

from contextlib import nested

from datasets import datasets

ORIGIN_DIM = 5000

def pca(origin_mat):

"""

gen matrix using pca

row of origin_mat is one sample of dataset

col of origin_mat is one feature

return matrix U, s and V

"""

# mean,normaliza1on

avg = numpy.mean(origin_mat, axis=0)

# covariance matrix

cov = numpy.cov(origin_mat-avg,rowvar=0)

#Singular Value Decomposition

k = 1;

sigma_s = numpy.sum(s)

# chose smallest k for 99% of variance retained

for k in range(1, ORIGIN_DIM+1):

variance = numpy.sum(s[0:k]) / sigma_s

print "k = %d, variance is %f" % (k, variance)

if variance >= 0.99:

break

if k == ORIGIN_DIM:

print "some thing unexpected , k is same as ORIGIN_DIM"

exit(1)

return U[:, 0:k], k

if __name__ == __main__ :

"""

main, read train.txt, and do pca

save file to train_pca.txt

"""

data_sets = datasets()

train_text, _ = data_sets.read_from_disk(".", "train", one_hot=False)

U, k = pca(train_text)

print "U shpae: ", U.shape

print "k is : ", k

text_pca = numpy.dot(train_text, U)

text_num = text_pca.shape[0]

print "text_num in pca is ", text_num

with open("./train_pca.txt", "a+") as f:

for i in range(0, text_num):

f.write(" ".join(map(str, text_pca[i,:])) + "
")

最終得到k=2583。該部分準確率有所提高但影響不大。

調整網路參數

該部分主要根據嚴重集和測試集的表現不斷調整網路參數,包括學習率、網路層數、每層節點個數、正則損失、迭代次數、batch大小等。最終得到80%的準確率。

小結

對神經網路進行初步優化,由原來的65%的準確率提高到80%,主要的提高在於訓練數據的隨機化,以及網路結構的調整。為提升訓練速度,同時減少內存消耗,對數據進行了降維操作。

之後對代碼的結構進行了整理,這裡沒有提及,該部分代碼包括nn_interface.py和nn_train.py分別實現對網路結構的定義以及訓練流程的管理。

後面會結合tensorflow的使用技巧對訓練進行進一步優化。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

聊一聊關於區塊鏈開源的3大問題
數據太大爆內存怎麼辦?七條解決思路
開發者自述:我是怎樣理解支持向量機與神經網路的
榨出聊天機器人的價值!用 Tensorflow 搭建能理解語境的客服小二!
一篇文章教你用TensorFlow寫名著

TAG:唯物 |

您可能感興趣

用TensorFlow Estimator實現文本分類
如何使用Tokenvator和Windows Tokens實現提權
用Pytorch 實現的 Capsule Network
基於Tensorflow實現DeepFM
使用Tensorflow Object Detection API實現對象檢測
用TensorFlow實現物體檢測的像素級分類
用 TensorFlow 實現物體檢測的像素級分類
用WebRTC在Firefox上實現YouTube直播
谷歌正式開源 Hinton 膠囊理論代碼,即刻用 TensorFlow 實現吧
在Spark 上實現 TensorFlow 的庫——Sparkflow
Ether Universe項目評測:第四代跨鏈技術實現「異鏈」Tokens直接交換
基於TensorFlow的變分自編碼器實現
用攝像頭和Tensorflow.js在瀏覽器上實現目標檢測
Pytorch實現Logistic回歸二分類
Machine Learning(一):基於 TensorFlow 實現寵物血統智能識別
SAP Cloud for Customer Extensibility的設計與實現
CapsNet入門系列番外:基於TensorFlow實現膠囊網路
連發Science、Nature Physics:谷歌展示量子霸權實現藍圖
用Python 實現的機器人演算法示例集合——PythonRobotics
德國女性已經實現了自我?Deutsche Frauen verwirklichen sich selbst……