TensorFlow初步(4)
TensorFlow初步(4)
大家好我是zyy,本人是機器學習和深度學習的初學愛好者,想跟大家一起分享我的學習經驗,大家一起交流。我寫的東西不一定全對,但肯定是我一步一步走出來的坑,嚼爛了的經驗,可以供大家直接「吸收」
我的文章主要會涉及各種機器學習和深度學習演算法的推導和輪子的實現,以及一些小的應用demo,偶爾還會有一些論文的演算法實現。
文中出現的所有代碼都可以在我的GitHub上找到。
[GitHub](https://github.com/YuyangZhangFTD/zyy_ML-DL)
邏輯回歸模型 LR
拖更了這麼久我終於回來了。今天講ML中最簡單的粗暴且有用的模型,邏輯回歸,Logistic Regression。
LR可以從兩個角度理解:
- 將數據通過線性加權映射到
的區間上,採用logistic disturibution進行映射,判斷發生的概率。
- 一種線性模型的轉變,簡單的
線性回歸進行小小的改變,等號左邊的
作為正樣本與負樣本出現可能比值的對數,即我們規定
為正樣本出現概率,正樣本與負樣本出現概率的比值為
,對其取對數
,以此作為線性回歸的輸出值,即
,我們將該式整理一下即可得到
。
現在我們對它是正樣本還是負樣本的概率有了一個估計,那麼我們怎麼來衡量並糾正這個偏差呢?此處就要說到最大似然了。不知道最大似然估計的回去買本張宇概率論9講去做。
我們令和
,則其似然函數為
,同樣的我們對其取負對數然後求極小值。
到這這個似然函數就寫全了,然後我們求的導數,用梯度下降的方式求極值。
有了梯度我們就可以迭代w了。
這裡有個小trick,當我們要做多分類問題的時候,同樣可以用這樣的方法,二分類的邏輯回歸,多分類的邏輯回歸
是輸出的屬於每個類的概率,也叫Softmax。
Python普通版
畢竟是在趕文章,這次代碼質量很低,以後有時間再好好寫。
import numpy as npnimport pandas as pdnn# parameter initnlearning_rate = 0.001nn_epochs = 100nnndef sigmod(para_x, para_w):ntwx = np.array([np.dot(x,para_w) for x in para_x])ntreturn 1/(1+np.exp((-1)*wx))nnndef ave_loss(para_x, para_w, para_y):ntwx = np.array([np.dot(x,para_w) for x in para_x])nttmp = np.exp(wx+1)ntreturn (-1)*np.average(para_y*wx-np.log(tmp))nnndef gradient(para_x, para_w, para_y):ntwx = np.array([np.dot(x,para_w) for x in para_x])nttmp = para_y - 1/(1+np.exp((-1)*wx))ntreturn (-1)*sum([para_x[ii]*tmp[ii] for ii in range(len(tmp))])nnnntdata (x_1, x_2, 1)tntlabel yttttin {0,1}ntweight (w_1, w_2, b)nndata = pd.read_csv(Labeled_Data_2CLS_100.CSV)ncls = data.values[:,2]ndata = data.values[:,:2]nx_bias = np.ones(len(data))ndata = np.column_stack((data, x_bias))nweight = np.random.random(size=3)nnfor i in range(n_epochs):nttprint(epoch :, i)nttprint(average loss :, ave_loss(data, weight, cls))nttweight -= gradient(data, weight, cls) * learning_raten
TensorFlow版
這次tensorflow版,小問題不斷,改了一下午,睡了一覺才寫好。下面放代碼!
import numpy as npnimport matplotlib.pyplot as pltnimport tensorflow as tfnimport pandas as pdnnn# read datandata = pd.read_csv(Labeled_Data_2CLS_100.CSV)ntemp = data.values[:, 2]nys = np.array([[1, 0] for x in temp if x == 0] + [[0, 1] for x in temp if x == 1])nxs = data.values[:, :2]nn# parameter initnn_epochs = 100neta = 0.01nnnn_input = 2nn_output = 2nnnX = tf.placeholder(tf.float32, [None, n_input])nY = tf.placeholder(tf.float32, [None, n_output])nW = tf.Variable(tf.zeros([n_input, n_output]))nb = tf.Variable(tf.zeros([n_output]))ny_hat = tf.nn.softmax(tf.matmul(X, W) + b) # softmax functionncross_entropy = -tf.reduce_sum(Y * tf.log(y_hat))ncorrect_prediction = tf.equal(tf.argmax(y_hat, 1), tf.argmax(Y, 1))naccuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))noptimizer = tf.train.GradientDescentOptimizer(eta).minimize(cross_entropy)nnwith tf.Session() as sess:n sess.run(tf.global_variables_initializer())n prev_training_cost = 0.0n for i_epoch in range(n_epochs):n for (x, y) in zip(xs, ys):n # the 1-dim matrix in numpy is terrible!!n # this is a solution I find in overstack.n # overstack is a good place!n temp = x.shapen x = x.reshape(1, temp[0])n temp = y.shapen y = y.reshape(1, temp[0])n sess.run(optimizer, feed_dict={X: x, Y: y})nn if i_epoch % 20 == 0:n training_cost = sess.run(accuracy, feed_dict={X: xs, Y: ys})n print(training_cost)n print(sess.run(W), sess.run(b))n
小總結
寫了4期了,我覺得大家如果都是自己動手做一下的話,很容易發現這個TensorFlow好用在哪,麻煩在哪。就我個人而言,我覺得簡化訓練過程,而且數據流簡單清晰,只要你知道你的model該長什麼樣,一組數據該從哪到哪,怎麼加工,用TensorFlow實現後根本不用關心具體怎麼訓練,開個電影等結果就好。麻煩呢,肯定也有,小的地方要注意很多,畢竟比起自己從0寫一個東西,很多東西自己定義想怎麼來怎麼來要麻煩點。
話說各位不要看我文章只看我封面圖就舉報啊喂(╯ - )╯︵ ┻━┻
圖你都看了還要舉報 (╯°Д°)╯︵ ┻━┻
下期帶來神經網路TensorFlow。(幽怨地說,這周剩下的32小時我還要更2-3篇啊...
推薦閱讀:
※五分鐘喝不完一杯咖啡,但五分鐘可以帶你入門TensorFlow
※CNN中卷積層的計算細節
※Tensorflow 免費中文視頻教程,開源代碼,免費書籍.
※NLP(2) Tensorflow 文本- 價格建模 Part2
※TensorFlow初步(5)
TAG:机器学习 | TensorFlow | Python |
