機器學習概念_3
阿新 • • 發佈:2018-12-20
基於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(學習率):決定引數每次更新的幅度