博文配套视频课程:24小时实现从零到AI人工智能
误差率转化正确率
在分类与回归问题中,默认返回的是训练的误差,但是误差这个度量不够直观,也不方便两个模型做比较。例如:预测学生分数误差是20分,但是预测房价的误差是200元,虽然后者比前者的误差大,但是大家都应该知道后者预测模型肯定比前者要好。为了避免这种情况出现,我们应该把误差转化为正确率。
import numpy as np
import tensorflow as tf
y_predict = np.array([[1, 9, 3, 4, 6],
[0, 2, 4, 4, 8]
])
y_true = np.array([[2, 3, 4, 5, 9],
[1, 3, 3, 3, 8]
])
with tf.Session() as sess:
# axis为0代表获取每列最大值,1代表获取每行最大值
print(sess.run(tf.argmax(y_predict, 1))) # [1 4]
print(sess.run(tf.argmax(y_true, 1))) # [4 4]
# 张量(标量,向量,矩阵)的每个值进行比较,比对成功返回为True否则为False
print(sess.run(tf.equal([1,2,3], [3,2,1]))) # [False True False]
equal_list = sess.run(tf.equal(tf.argmax(y_predict, 0), tf.argmax(y_true, 0)))
print(equal_list) # [ True True False True False]
# 看源码:将x的数据格式转化成dtype.
# 如果是bool则转化为0,1 反之亦然
accuracy_list = sess.run(tf.cast(equal_list, tf.float32))
print('命中率列表', accuracy_list) # [1. 1. 0. 1. 0.]
# 求和在求平均,则可以得到正确率
accuracy = tf.reduce_mean(accuracy_list) # 0.6
print('求准确率', sess.run(accuracy))
正确率,步长调优
# 完成图形图像的加载 (分辨率和尺寸相同)
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# 通过函数下载或者加载本地的图片资源,建议设置one_hot=True
mnist = input_data.read_data_sets("../data/input_data",one_hot=True)
# 训练的时候不会一次性加载55000,因此需要采用占位符
X = tf.placeholder(tf.float32,[None,784])
y_true = tf.placeholder(tf.float32,[None,10])
# 多少个连接就会有多少个权重weight [None,784] dot [784,10] ===> [None,10]
# 变量: 深度学习过程中可变的量
weight = tf.Variable(tf.random.normal([784,10]),name="weight")
bias = tf.Variable(tf.random.normal([10]),name="bias")
y_predict = tf.matmul(X,weight) + bias # matmul == dot
# softmax: 就是把向量值归一化到[0,1]之间,总和为1
y_predict = tf.nn.softmax(y_predict)
loss = -tf.reduce_mean(y_true * tf.log(y_predict))
# 采用梯度下降公式来减少误差值: 学习率 0,1之间
train_op = tf.train.GradientDescentOptimizer(0.7).minimize(loss)
# 获取神经网络每次运行的正确率
result = tf.equal(tf.argmax(y_predict,axis=1),tf.argmax(y_true,axis=1))
result = tf.cast(result,tf.float32)
accuracy = tf.reduce_mean(result)
# 通过会话连接graph图
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(5000):
# 每一次获取指定数量的样本和样本的目标值
mnist_x,mnist_y = mnist.train.next_batch(55)
d = {X:mnist_x,y_true:mnist_y}
sess.run(train_op,feed_dict=d)
print(f'第{i+1}次训练的正确率为:{sess.run(accuracy,feed_dict=d)}')
简单神经网络缺点
通过上面代码可以看书,无论步长是5000还是10000 我们的正确率基本上在85%~90%之间,很难在有新的提升,在这种情况下就不是训练次数不够了,而是模型本身需要优化。
- 简单神经网络只有输入和输出,没有隐藏层,问题不能被拆分因此训练模型粗糙
- 如果物体本身比较复杂,例如人脸识别,那么很多时候我们应该把人脸进行拆分鼻子、嘴巴、耳朵… 这样就需要构建隐藏神经网络
- 如果一张图有很多的物体,那么我们应该把每个物体单独拿来处理,这个时候就会用到更高级的卷积神经网络