手把手教你用 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……