1. 程式人生 > >Python與自然語言處理(三):Tensorflow基礎學習

Python與自然語言處理(三):Tensorflow基礎學習

看了一段時間的TensorFlow,然而一直沒有思路,偶然看到一個講解TensorFlow的系列  視訊,通俗易懂,學到了不少,在此分享一下,也記錄下自己的學習過程。

教學視訊連結:點這裡

在機器學習中,常見的就是分類問題, 郵件分類,電影分類 等等

我這裡使用iris的資料進行花的種類預測,iris是一個經典的資料集,在weka中也有使用。

iris資料集:點這裡

資料集示例:

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
在做 分類預測前,我對資料集進行了處理,這裡有三種類別 的花,分別以(1,0,0)表示Iris-setosa,(0,1,0)表示Iris-versicolor,(0,0,1)表示Iris-virginica

處理後的資料集示例:

4.4,3.2,1.3,0.2,1,0,0
5.0,3.5,1.6,0.6,1,0,0
5.1,3.8,1.9,0.4,1,0,0
5.7,3.0,4.2,1.2,0,1,0
5.7,2.9,4.2,1.3,0,1,0
6.2,2.9,4.3,1.3,0,1,0
5.8,2.7,5.1,1.9,0,0,1
6.8,3.2,5.9,2.3,0,0,1
6.7,3.3,5.7,2.5,0,0,1

思路:

首先,將資料集分成兩份,一部分為training set,共120條資料;一部分為testing set,共30條資料。

然後,讀取資料檔案(txt格式),每條資料的1~4列為輸入變數,5~7列為花的種類,所以輸入為4元,輸出為3元。

之後,初始化權重(weights)和 偏量(biase),根據Y=W*X+b進行計算。

最後,計算預測值 與真實值的差距,並選擇合適的學習速率來減小差距。


具體實現如下:

# -*-coding=utf-*-
import tensorflow as tf
import numpy as np

training_data = np.loadtxt('./MNIST_data/iris_training.txt',delimiter=',',unpack=True,dtype='float32')
test_data = np.loadtxt('./MNIST_data/iris_test.txt',delimiter=',',unpack=True,dtype='float32')

training_data = training_data.T #轉置
test_data = test_data.T

#print(training_data.shape)

iris_X = training_data[:,0:4] #[行,列]
iris_Y = training_data[:,4:7]

iris_test_X = test_data[:,0:4]
iris_test_Y = test_data[:,4:7]

def add_layer(inputs,in_size,out_size,activation_function=None):
	Weights = tf.Variable(tf.random_normal([in_size,out_size]))
	biases = tf.Variable(tf.zeros([1,out_size])) + 0.1 #推薦biases最好不為零
	Wx_plus_b = tf.matmul(inputs,Weights) + biases
	if activation_function is None: #activation_function=none表示線性函式,否則是非線性
		outputs = Wx_plus_b
	else:
		outputs = activation_function(Wx_plus_b)
	return outputs

def computer_accuracy(v_xs,v_ys):
	global prediction
	y_pre = sess.run(prediction,feed_dict={xs:v_xs})
	correct_prediction = tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))
	accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
	result = sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})
	return result

xs = tf.placeholder(tf.float32,[None,4])
ys = tf.placeholder(tf.float32,[None,3])

prediction = add_layer(xs,4,3,activation_function=tf.nn.softmax) #softmax一般用來做classification

cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1])) #loss
#學習速率根據 具體使用的資料進行選取
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy)
init = tf.initialize_all_variables()sess = tf.Session()sess.run(init)
for i in range(700): #迭代700次
      sess.run(train_step,feed_dict={xs:iris_X,ys:iris_Y})
      if i % 50 == 0:
            print(computer_accuracy(iris_test_X,iris_test_Y),sess.run(cross_entropy,feed_dict={xs:iris_X,ys:iris_Y})) #測試準確率與訓練誤差
 

輸出:
第一次測試:
(0.53333336, 1.4005684)
(0.60000002, 1.0901265)
(0.56666666, 0.88059545)
(0.69999999, 0.75857288)
(0.76666665, 0.69699961)
(0.80000001, 0.66695786)
(0.80000001, 0.65065509)
(0.80000001, 0.63982773)
(0.80000001, 0.63119632)
(0.80000001, 0.62356067)
(0.80000001, 0.61648983)
(0.80000001, 0.60982168)
(0.80000001, 0.60348624)
(0.80000001, 0.59744602)

第二次測試:
(0.53333336, 6.5918231)
(0.60000002, 5.4625101)
(0.60000002, 4.4928107)
(0.60000002, 3.6116555)
(0.60000002, 2.8158391)
(0.56666666, 2.094959)
(0.53333336, 1.4308809)
(0.53333336, 0.89007533)
(0.5, 0.61958134)
(0.46666667, 0.53800708)
(0.5, 0.51004487)
(0.46666667, 0.49609584)
(0.5, 0.48745066)
(0.5, 0.48149654)

這裡使用的numpy,因此需要對numpy有所瞭解。這裡沒有涉及到隱藏層,只有一層輸入層和一層輸出層,分類的準確率不是太好,每次測試的結果也不相同,應該跟weights的初始值有關;為提高準確率,考慮加入隱藏層,按照這個思路繼續嘗試!

訓練生成的網路想要 儲存下來 就需要用到tensorflow.train.Saver()了,下面是一個簡單的例子:

import tensorflow as tf
import numpy as np

#save to file
W = tf.Variable([[1.,2.,3.],[4.,5.,6.]],name='weights')
b = tf.Variable([[1.,2.,3.]],name='biases')

init = tf.initialize_all_variables()

saver = tf.train.Saver()

with tf.Session() as sess:
	sess.run(init)
	save_path = saver.save(sess,"./save_net.ckpt") #儲存網路到XX路徑
	print('Save to path:',save_path)


#restore variables
#redefine the same shape and same type for your variables
<span style="font-size:18px;"></span><pre name="code" class="python">#因為訓練時 W和b都是float32的型別,若不指定資料型別會報錯
w_type = np.array(np.arange(6).reshape(2,3),dtype=np.float32)b_type = np.array(np.arange(3).reshape(1,3),dtype=np.float32)W = tf.Variable(w_type,name='weights')b = tf.Variable(b_type,name='biases')#not need init stepsaver = tf.train.Saver()with tf.Session() as sess:saver.restore(sess,'./save_net.ckpt') #從XX路徑讀取網路print('weights:',sess.run(W))print('weights:',sess.run(b))


【output】:
 


相關推薦

Python自然語言處理Tensorflow基礎學習

看了一段時間的TensorFlow,然而一直沒有思路,偶然看到一個講解TensorFlow的系列  視訊,通俗易懂,學到了不少,在此分享一下,也記錄下自己的學習過程。 教學視訊連結:點這裡 在機器學習中,常見的就是分類問題, 郵件分類,電影分類 等等 我這裡使用iris的

python自然語言處理中文文字詞雲

之前一直想要做一個文字的視覺化:詞雲,然後在網上搜到的一些製作詞雲的工具,有些是線上的就沒有使用,今天偶然看到python提供的wordcloud庫,可以方便製作詞雲,中英文皆可,趕緊試試,做個筆記,

python自然語言處理中文文字轉影象

最近使用word2vec對文字進行向量化表示,然後模仿基於CNN的影象分類實現文字分類。既然是模仿影象,那就應該可以將文字用影象視覺化一下,看看量化後的文字是什麼樣子。python處理影象的基本模組是Image庫,由於實驗中使用的是python3,需要安裝的影象處理庫為Pil

Python自然語言處理搭建環境

參考書籍《Python自然語言處理》,書籍中的版本是Python2和NLTK2,我使用的版本是Python3和NLTK3 安裝NLTK3,Natural Language Toolkit,自然語言工

Python自然語言處理基於Gensim的Word2Vec

繼續學習摸索,看到很多部落格都在研究Word2Vec,感覺挺有意思,我也來嘗試一下。 實驗環境:Python3,Java8 Word2Vec的輸入是句子序列,而每個句子又是一個單詞列表,由於沒有這樣結構的現成輸入,所以決定自己動手對原始語料進行預處理。 這裡還有一個自然語

深度學習自然語言處理——深度學習運用到自然語言處理領域的成功案例

目錄 1.全連線前饋神經網路(MLP)的應用 大部分情況下,全連線前饋神經網路(MLP)能被用來替代線性學習器。這包括二分類或多分類問題,以及更復雜的結構化預測問題。網路的非線性以及易於整合預訓練詞嵌入的能力經常帶來更高的分類精度。一系列工作通過簡單地將句

《使用Python進行自然語言處理Nltk》2

import nltk from nltk.corpus import * '''1、古騰堡語料庫''' gutenberg.fileids() #所有古騰堡語料庫中的文字 emma = nltk.corpus.gutenberg.words('austen-e

深度學習自然語言處理

自然語言處理主要研究用計算機來處理、理解以及運用人類語言(又稱自然語言)的各種理論和方法,屬於人工智慧領域的一個重要研究方向,是電腦科學與語言學的交叉學科,又常被稱為計算語言學。隨著網際網路的快速發展,網路文字尤其是使用者生成的文字成爆炸式增長,為自然語言處理帶來了巨大的應用

聊天機器人chatbot終極指南自然語言處理NLP和深度機器學習Deep Machine Learning

為了這份愛 在過去的幾個月中,我一直在收集自然語言處理(NLP)以及如何將NLP和深度學習(Deep Learning)應用到聊天機器人(Chatbots)方面的最好的資料。 時不時地我會發現一個出色的資源,因此我很快就開始把這些資源編製成列表。 不久,我就

1.自然語言處理NLPPython

自然語言工具包(NLTK) NLTK 創建於 2001 年,最初是賓州大學計算機與資訊科學系計算語言學課程的一部分 。從那以後,在數十名貢獻者的幫助下不斷髮展壯大。如今,它已被幾十所大學的課程所採納 ,並作為許多研究專案的基礎。NLTK模組及功能介紹如下:

python自然語言處理

1詞性標註 簡單的理解就是對詞性(POS)進行標註,但在不同的領域,詞性可能是不同的,Penn Treebank pos標記庫:https://blog.csdn.net/u010099495/article/details/46776617 其中程式需要安裝兩個依賴包 nlt

python自然語言處理

1標識化處理 何為標識化處理?實際上就是一個將原生字串分割成一系列有意義的分詞,其複雜性根據不同NLP應用而異,目標語言的複雜性也佔了很大部分,例如中文的標識化是要比英文要複雜。 word_tokenize()是一種通用的,面向所有語料庫的標識化方法,基本能應付絕大多數。 reg

自然語言處理NLP- HMM+VITERBI演算法實現詞性標註解碼問題動態規劃Python實現

NLP- HMM+維特比演算法進行詞性標註(Python實現)     維特比演算法針對HMM解碼問題,即解碼或者預測問題(下面的第二個問題),尋找最可能的隱藏狀態序列:對於一個特殊的隱馬爾可夫模型(HMM)及一個相應的觀察序列,找到生成此序列最可能的隱藏狀態序列。也就是說

Python 自然語言處理NLP工具庫彙總

6.spaCy 這是一個商業的開源軟體。結合了Python 和Cython 優異的 NLP 工具。是快速的,最先進的自然語言處理工具。 網站: 安裝: pip install spacy 7.Polyglot Polyglot 支援大規模多語言應用程式的處理。它支援165種語言的分詞,196中語言的辨識,

Python自然語言處理NLP工具小結

Python 的幾個自然語言處理工具 自然語言處理(Natural Language Processing,簡稱NLP)是人工智慧的一個子域。自然語言處理的應用包括機器翻譯、情感分析、智慧問答、資訊提取、語言輸入、輿論分析、知識圖譜等方面。也是深度學習的一個分

python自然語言處理之中文分詞預處理、統計詞頻

一個小的嘗試。。資料來源資料集 一共200條關於手機的中文評論,以XML格式儲存。分詞工具 python-jieba預處理包括去停用詞、去標點符號和數字去停用詞:使用的是他人總結的 停用詞表去標點符號和數字:用正則表示式。原本打算的是中文標點符號從網上覆制,英文標點符號用st

python自然語言處理NLP1------中文分詞1,基於規則的中文分詞方法

python中文分詞方法之基於規則的中文分詞 目錄 常見中文分詞方法 推薦中文分詞工具 參考連結 一、四種常見的中文分詞方法: 基於規則的中文分詞 基於統計的中文分詞 深度學習中文分詞 混合分詞方法 基於規則的中

OpenCV3計算機視覺Python語言實現使用OpenCV3處理影象

3.1 不同色彩空間的轉換 3.2 傅立葉變換 3.2.1 高通濾波器 HPF 3.2.2 低通濾波器 LPF 3.3 建立模組 3.4 邊緣檢測 3.5 用定製核心做卷積 3.6 修改應用 3.7

自然語言處理中傳統詞向量表示VS深度學習語言模型word2vec詞向量

        在前面的部落格中,我們已經梳理過語言表示和語言模型,之所以將這兩部分內容進行梳理,主要是因為分散式的詞向量語言表示方式和使用神經網路語言模型來得到詞向量這兩部分,構成了後來的word2vec的發展,可以說是word2vec的基礎。1.什麼是詞向量       

python數字圖像處理邊緣檢測常用算子

lin tco lap def ood 獲得 iou keep 算法 在該文將介紹基本的幾種應用於邊緣檢測的濾波器,首先我們讀入saber用來做為示例的圖像 #讀入圖像代碼,在此之前應當引入必要的opencv matplotlib numpy saber = cv2.imr