機(jī)器學(xué)習(xí)進(jìn)階筆記之一 | TensorFlow安裝與入門
引言
TensorFlow是Google基于DistBelief進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),被廣泛用于語音識別或圖像識別等多項(xiàng)機(jī)器深度學(xué)習(xí)領(lǐng)域。其命名來源于本身的運(yùn)行原理。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計(jì)算,TensorFlow代表著張量從圖象的一端流動到另一端計(jì)算過程,是將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進(jìn)行分析和處理的過程。
TensorFlow完全開源,任何人都可以使用??稍谛〉揭徊恐悄苁謾C(jī)、大到數(shù)千臺數(shù)據(jù)中心服務(wù)器的各種設(shè)備上運(yùn)行。
『機(jī)器學(xué)習(xí)進(jìn)階筆記』系列是將深入解析TensorFlow系統(tǒng)的技術(shù)實(shí)踐,從零開始,由淺入深,與大家一起走上機(jī)器學(xué)習(xí)的進(jìn)階之路。
CUDA與TensorFlow安裝
按以往經(jīng)驗(yàn),TensorFlow安裝一條pip命令就可以解決,前提是有fq工具,沒有的話去找找墻內(nèi)別人分享的地址。而坑多在安裝支持gpu,需預(yù)先安裝英偉達(dá)的cuda,這里坑比較多,推薦使用ubuntu deb的安裝方式來安裝cuda,run.sh的方式總感覺有很多問題,cuda的安裝具體可以參考。 注意鏈接里面的tensorflow版本是以前的,tensorflow 現(xiàn)在官方上的要求是cuda7.5+cudnnV4,請?jiān)诎惭b的時(shí)候注意下。
Hello World
- import tensorflow as tf
- hello = tf.constant('Hello, TensorFlow!')
- sess = tf.Session()
- print sess.run(hello)
首先,通過tf.constant創(chuàng)建一個(gè)常量,然后啟動Tensorflow的Session,調(diào)用sess的run方法來啟動整個(gè)graph。
接下來我們做下簡單的數(shù)學(xué)的方法:
- import tensorflow as tf
- a = tf.constant(2)
- b = tf.constant(3)
- with tf.Session() as sess:
- print "a=2, b=3"
- print "Addition with constants: %i" % sess.run(a+b)
- print "Multiplication with constants: %i" % sess.run(a*b)
- # output
- a=2, b=3
- Addition with constants: 5
- Multiplication with constants: 6
接下來用tensorflow的placeholder來定義變量做類似計(jì)算:
placeholder的使用見https://www.tensorflow.org/versions/r0.8/api_docs/python/io_ops.html#placeholder
- import tensorflow as tf
- a = tf.placeholder(tf.int16)
- b = tf.placeholder(tf.int16)
- add = tf.add(a, b)
- mul = tf.mul(a, b)
- with tf.Session() as sess:
- # Run every operation with variable input
- print "Addition with variables: %i" % sess.run(add, feed_dict={a: 2, b: 3})
- print "Multiplication with variables: %i" % sess.run(mul, feed_dict={a: 2, b: 3})
- # output:
- Addition with variables: 5
- Multiplication with variables: 6
- matrix1 = tf.constant([[3., 3.]])
- matrix2 = tf.constant([[2.],[2.]])
- with tf.Session() as sess:
- result = sess.run(product)
- print result
線性回歸
以下代碼來自GitHub - aymericdamien/TensorFlow-Examples: TensorFlow Tutorial and Examples for beginners,僅作學(xué)習(xí)用
- activation = tf.add(tf.mul(X, W), b)
- # Minimize the squared errors
- cost = tf.reduce_sum(tf.pow(activation-Y, 2))/(2*n_samples) #L2 loss
- optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent
- # Initializing the variables
- init = tf.initialize_all_variables()
- # Launch the graph
- with tf.Session() as sess:
- sess.run(init)
- # Fit all training data
- for epoch in range(training_epochs):
- for (x, y) in zip(train_X, train_Y):
- sess.run(optimizer, feed_dict={X: x, Y: y})
- #Display logs per epoch step
- if epoch % display_step == 0:
- print "Epoch:", '%04d' % (epoch+1), "cost=", \
- "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y:train_Y})), \
- "W=", sess.run(W), "b=", sess.run(b)
- print "Optimization Finished!"
- print "cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), \
- "W=", sess.run(W), "b=", sess.run(b)
- #Graphic display
- plt.plot(train_X, train_Y, 'ro', label='Original data')
- plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
- plt.legend()
- plt.show()
邏輯回歸
- import tensorflow as tf
- # Import MINST data
- from tensorflow.examples.tutorials.mnist import input_data
- mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
- # Parameters
- learning_rate = 0.01
- training_epochs = 25
- batch_size = 100
- display_step = 1
- # tf Graph Input
- x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784
- y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes
- # Set model weights
- W = tf.Variable(tf.zeros([784, 10]))
- b = tf.Variable(tf.zeros([10]))
- # Construct model
- pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax
- # Minimize error using cross entropy
- cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
- # Gradient Descent
- optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
- # Initializing the variables
- init = tf.initialize_all_variables()
- # Launch the graph
- with tf.Session() as sess:
- sess.run(init)
- # Training cycle
- for epoch in range(training_epochs):
- avg_cost = 0.
- total_batch = int(mnist.train.num_examples/batch_size)
- # Loop over all batches
- for i in range(total_batch):
- batch_xs, batch_ys = mnist.train.next_batch(batch_size)
- # Run optimization op (backprop) and cost op (to get loss value)
- _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
- y: batch_ys})
- # Compute average loss
- avg_cost += c / total_batch
- # Display logs per epoch step
- if (epoch+1) % display_step == 0:
- print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost)
- print "Optimization Finished!"
- # Test model
- correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
- # Calculate accuracy
- accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
- print "Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels})
- # result :
- Epoch: 0001 cost= 29.860467369
- Epoch: 0002 cost= 22.001451784
- Epoch: 0003 cost= 21.019925554
- Epoch: 0004 cost= 20.561320320
- Epoch: 0005 cost= 20.109135756
- Epoch: 0006 cost= 19.927862290
- Epoch: 0007 cost= 19.548687116
- Epoch: 0008 cost= 19.429119071
- Epoch: 0009 cost= 19.397068211
- Epoch: 0010 cost= 19.180813479
- Epoch: 0011 cost= 19.026808132
- Epoch: 0012 cost= 19.057875510
- Epoch: 0013 cost= 19.009575057
- Epoch: 0014 cost= 18.873240641
- Epoch: 0015 cost= 18.718575359
- Epoch: 0016 cost= 18.718761925
- Epoch: 0017 cost= 18.673640560
- Epoch: 0018 cost= 18.562128253
- Epoch: 0019 cost= 18.458205289
- Epoch: 0020 cost= 18.538211225
- Epoch: 0021 cost= 18.443384213
- Epoch: 0022 cost= 18.428727668
- Epoch: 0023 cost= 18.304270616
- Epoch: 0024 cost= 18.323529782
- Epoch: 0025 cost= 18.247192113
- Optimization Finished!
- (10000, 784)
- Accuracy 0.9206
這里有個(gè)小插曲,ipython notebook在一個(gè)notebook打開時(shí),一直在占用GPU資源,可能是之前有一個(gè)notebook一直打開著,然后占用著GPU資源,然后在計(jì)算Accuracy的”InternalError: Dst tensor is not initialized.” 然后找了github上面也有這個(gè)問題InternalError: Dst tensor is not initialized.,可以肯定是GPU的memory相關(guān)的問題,所以就嘗試加上tf.device(‘/cpu:0’),將Accuracy這步拉到cpu上計(jì)算,但是又出現(xiàn)OOM的問題,***nvidia-smi時(shí),發(fā)現(xiàn)有一個(gè)python腳本一直占用3g多的顯存,把它kill之后恢復(fù)了,之前還比較吐槽怎么可能10000*784個(gè)float就把顯存撐爆呢,原來是自己的問題。
這里邏輯回歸,model是一個(gè)softmax函數(shù)用來做多元分類,大概意思是選擇10當(dāng)中***預(yù)測概率***作為最終的分類。
其實(shí)基本的tensorflow沒有特別好講的,語法的課程什么可以去看看基本的文檔,之后我會找一點(diǎn)經(jīng)典有趣的tensorflow的代碼應(yīng)用來看看,畢竟『show me the code 』才是程序猿應(yīng)有的態(tài)度。
【本文是51CTO專欄機(jī)構(gòu)作者“大U的技術(shù)課堂”的原創(chuàng)文章,轉(zhuǎn)載請通過微信公眾號(ucloud2012)聯(lián)系作者】