1. 程式人生 > >機器學習概念_3

機器學習概念_3

基於tensorflow搭建的神經網路(Netural Network, NN)模型

一、實現過程

  • 準備資料集,提取特徵,輸入NN
  • 搭建NN結構,從輸入到輸出(前向傳播:先搭建計算圖,再用會話執行)
  • 大量特徵輸入NN,迭代優化NN引數(反向傳播:優化引數)
  • 使用訓練好的模型預測和分類

二、張量(tensor)

  • tf.constant:常量Tensor
  • tf.Variable:變數Tensor
  • tf.matmul 矩陣乘矩陣
  • tf.multiply 矩陣中的對應元素各自相乘
  • tf.truncated_normal(list, stddev, mean, seed) 去掉過大偏離點正態分佈,stddev標準差,mean均值,seed隨機種子
  • tf.random_normal(list, stddev, mean, seed) 正態分佈
  • tf.random_uniform(list, stddev, mean, seed) 平均分佈
  • tf.zeros 全0陣列
  • tf.ones 全1陣列
  • tf.fill 全定值陣列
名稱 exp
0 0 標量scalar s = 123
1 1 向量vector v = [1,2,3]
2 2 矩陣matrix m = [[1,2,3],[4,5,6]]
n n 張量tensor t = [[[[....
import tensorflow as tf

# tensor 常量
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])

result = a + b
# Tensor("add:0", shape=(2,), dtype=float32)
# add:節點名稱
# 0:第0個輸出
# shape=(2, ) 1維陣列,長度2(list元素個數)
# dtype:資料型別
print(result)

會話tf.Session():變數初始化、計算圖節點運算都要使用會話

with tf.Session() as sess:
    sess.run(X)  # X表示變數初始化或者節點運算

初始化所有變數

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)  

用tf.placeholder佔位,在sess.run()函式中使用feed_dict={}餵給資料

# 1組資料
x = tf.placeholder(tf.float32, shape=(1,2)) # 1代表資料的數量:1list,2代表list的元素個數
with tf.Session() as sess:
    sess.run(y, feed_dict={[[0.5, 0.6]]})

# 多組資料
x = tf.placeholder(tf.float32, shape=(None,2))
with tf.Session() as sess:
    sess.run(y, feed_dict={[[0.1,0.2],[0.3,0.4][0.5, 0.6]]})
# 兩層簡單的神經網路(全連線)
import tensorflow as tf

# 定義輸入和引數(權重)

x = tf.constant([[0.7, 0.5]])
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

# 定義前向傳播過程

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 會話計算節點
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y))
# 兩層簡單的神經網路(全連線)
import tensorflow as tf

# 定義輸入和引數(權重)
# 用placeholder實現輸入定義:1組資料

x = tf.placeholder(tf.float32, shape=(1, 2))
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

# 定義前向傳播過程

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 會話計算節點
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y, feed_dict={x: [[0.7, 0.5]]}))
# 兩層簡單的神經網路(全連線)
import tensorflow as tf

# 定義輸入和引數(權重)
# 用placeholder實現輸入定義:多組資料

x = tf.placeholder(tf.float32, shape=(None, 2))
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

# 定義前向傳播過程

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 會話計算節點
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y, feed_dict={x: [[0.7, 0.5], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]}))

反向傳播

訓練模型引數,在梯度下降使NN模型在訓練資料上的損失函式最小

損失函式(loss):預測值y和已知值y_的差距

均方誤差MSE:   MSE(y_, y) = 

        loss = tf.reduce_mean(tf.squre(y_-y))

反向傳播訓練方法,以減小loss值位位優化目標

反向傳播優化器Optimizer:

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) 梯度下降優化器

train_step = tf.train.MomentumOptimizer(learning_rate).minimize(loss) 

train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

learning_rate(學習率):決定引數每次更新的幅度