機器學習中的HelloWorld

看西瓜書有一陣子了,想開始動手寫寫代碼,網上的機器學習教程大多會先介紹mnist手寫數字識別,可以說這是機器學習中的helloworld小程序了,那我也先從mnist手寫數字識別開始吧,代碼和網上的大同小異,用的是tensorflow框架,運用softmax回歸得到每張圖屬於每個數字的概率,用交叉熵衡量分類損失,基於梯度下降策略最小化損失,訓練得到參數 w,b。目前網上很多博客或教程最後只給出一個訓練結果(accuracy),參考前輩們代碼後,我增加了具體的識別功能。

以下上代碼(python和tensorflow都是初學,前面代碼是參考網上大佬們的,後面的寫得亂大家別介意(╥╯^╰╥))

import tensorflow as tffrom PIL import Imageimport numpy as np# 導入數據from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("/tmp/data/", one_hot=True)# 參數learning_rate = 0.01training_epochs = 25batch_size = 100display_step = 1# 模型輸入x = tf.placeholder(tf.float32, [None, 784]) y = tf.placeholder(tf.float32, [None, 10])# 要學習的參數W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))# softmax回歸得到預測值pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax# 最小化交叉熵損失函數cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)# 變數初始化init = tf.global_variables_initializer()# 開始訓練with tf.Session() as sess: sess.run(init) for epoch in range(training_epochs): avg_cost = 0. # 分批學習 total_batch = int(mnist.train.num_examples/batch_size) for i in range(total_batch): batch_xs, batch_ys = mnist.train.next_batch(batch_size) _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys}) # 平均損失 avg_cost += c / total_batch # 輸出每輪損失 if (epoch+1) % display_step == 0: print("Epoch:", %04d % (epoch+1), "cost=", "{:.9f}".format(avg_cost)) print("Optimization Finished!") # 具體識別某張圖片 im=Image.open(rC:administratorDesktop
um.jpg
) # 設置圖片格式 im=im.convert("L") im=im.resize((28,28),Image.ANTIALIAS) # 轉化為矩陣 data=np.matrix(im.getdata(),float32) tfdata=tf.constant(data) # 得到可能性最大值得下標,即為預測結果 pred = tf.nn.softmax(tf.matmul(tfdata, W) + b) print(sess.run(tf.argmax(pred,1)))

這只是入門級的小程序,魯棒性什麼的沒有考慮,隨便給張沒有數字的照片進去都能輸出結果,也只能識別一位數字....接下來會考慮實現任意數的識別,還有給出圖中沒有數字的異常提示。


推薦閱讀:

[貝葉斯二]之貝葉斯決策理論
機器學習面試之偏差方差
機器學習基石筆記12:非線性轉換
Learning Explanatory Rules from Noisy Data 閱讀筆記1
「猜你喜歡」—邏輯回歸分類

TAG:機器學習 | TensorFlow |