机器学习概念_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(学习率):决定参数每次更新的幅度