1. 程式人生 > >機器學習與Tensorflow(1)——機器學習基本概念、tensorflow實現簡單線性迴歸

機器學習與Tensorflow(1)——機器學習基本概念、tensorflow實現簡單線性迴歸

一、機器學習基本概念

1.訓練集和測試集

訓練集(training set/data)/訓練樣例(training examples): 用來進行訓練,也就是產生模型或者演算法的資料集

測試集(testing set/data)/測試樣例 (testing examples):用來專門進行測試已經學習好的模型或者演算法的資料集

2.特徵向量

特徵向量(features/feature vector):屬性的集合,通常用一個向量來表示,附屬於一個例項

3.分類問題和迴歸問題

分類 (classification): 目標標記為類別型(離散型)資料(category)

迴歸(regression): 目標標記為連續性數值 (continuous numeric value)

4.機器學習分類

有監督學習(supervised learning): 訓練集有類別標記(class label)

無監督學習(unsupervised learning): 無類別標記(class label)

半監督學習(semi-supervised learning):有類別標記的訓練集 + 無標記的訓練集

二、簡單線性迴歸

基本概念:

  • 簡單線性迴歸包含一個自變數(x)和一個因變數(y)
  • 被用來進行預測的變數叫做: 自變數(independent variable), x, 輸入(input)
  • 被預測的變數叫做:因變數(dependent variable), y, 輸出(output)
  • 以上兩個變數的關係用一條直線來模擬


三、Tensorflow基本概念

1.使用圖(graphs)來表示計算任務
2.在被稱之為會話(Session)的上下文(context)中執行圖
3.使用tensor(張量)表示資料
4.通過變數(Variable)來維護狀態
5.使用feed和fetch可以為任何的操作賦值或者從其中獲取資料

總結

  • Tensorflow是一個程式設計系統,使用圖(graphs)來表示計算任務,
  • 圖(graphs)中的節點稱之為op(operation)
  • 一個op獲得0個或者多個tensor(張量),執行計算,產生0個或者多個tensor。
  • tensor看作是一個n維的陣列或者列表。
  • 圖必須在會話(Session)裡被啟動。

#通過示意圖來理解其中含義:

#通過程式來理解其中含義:

#這兩句程式碼是防止警告(The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
m1 = tf.constant([[3,3]])    #建立一個常量op
m2 = tf.constant([[2],[3]])   #建立一個常量op
product =tf.matmul(m1,m2)   #建立一個矩陣乘法op,並將m1和m2傳入
sess = tf.Session()    #定義一個會話,啟動預設圖
result = sess.run(product)    #呼叫sess的run方法來執行矩陣乘法op,run(product)觸發了圖中的3個op
print(result)
sess.close   #關閉會話

#執行結果
[[15]]

#上述程式關於啟動預設圖有一個簡單寫法

sess = tf.Session()    
result = sess.run(product)   
print(result)
sess.close

等價表達方式:

with tf.Session() as sess:
    result = sess.run(product)
    print(result)

四、Tensorflow變數介紹

#變數介紹

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
x = tf.Variable([1,2])     #建立一個變數op
a = tf.constant([3,3])      #建立一個常量op
sub_m = tf.subtract(x,a)     #建立一個減法op
add_m = tf.add(x,sub_m)     #建立一個加法op
init = tf.global_variables_initializer()    #變數初始化(要想使用變數,必須寫這句程式碼)
with tf.Session() as sess:      #定義一個會話,啟動預設圖
    sess.run(init)             #觸發變數op
    print(sess.run(sub_m))
    print(sess.run(add_m))

# 要想使用變數,必須進行變數初始化 

init = tf.global_variables_initializer()

#利用程式實現自增1

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
state = tf.Variable(0,name='counter')     #建立一個變數op,並初始化為0
new_value = tf.add(state,1)        #建立一個op,作用是使state加1
update = tf.assign(state,new_value)    #賦值op
init = tf.global_variables_initializer()     #變數初始化
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(state))
    for _ in range(5):               
        sess.run(update)
        print(sess.run(state))
        
#執行結果
0
1
2
3
4
5

 

五、Tensorflow(fetch和feed)

fetch:在會話中可以執行多個op

#舉例理解
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
add_m = tf.add(input2,input3)
mul = tf.multiply(input1,add_m)
with tf.Session() as sess:
    result = sess.run([mul,add_m])   #執行多個op
    print(result)
#執行結果
[21.0, 7.0]

feed:feed的資料以字典的形式傳入

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
    print(sess.run(output,feed_dict={input1:[8.],input2:[2.]}))    #feed:feed的資料以字典的形式傳入

六、利用tensorflow 實現簡單線性迴歸

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import numpy as np
#使用numpy生成100個隨機點
x_data = np.random.rand(100)  
y_data = x_data * 0.1 + 0.2
#構造一個線性模型
b = tf.Variable(0.0)        
k = tf.Variable(0.0)
y = k * x_data + b
#二次代價函式
loss = tf.reduce_mean(tf.square(y_data-y))
#定義一個梯度下降演算法來進行訓練的優化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
#最小化代價函式
train = optimizer.minimize(loss)
#初始化變數
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for step in range(201):
        sess.run(train)
        if step % 20 == 0:
            print(step,sess.run([k,b]))

#執行結果
0 [0.057367731, 0.1013036]
20 [0.10604427, 0.19655526]
40 [0.10355464, 0.19797418]
60 [0.10209047, 0.19880863]
80 [0.10122941, 0.19929935]
100 [0.10072301, 0.19958796]
120 [0.10042521, 0.19975767]
140 [0.10025007, 0.19985747]
160 [0.10014708, 0.19991617]
180 [0.10008651, 0.1999507]
200 [0.10005087, 0.19997101]

#訓練200次後,k的值為0.10005087,接近0.1;b的值為0.19997101,接近0.2.