11_神经网络调优

在这里插入图片描述


博文配套视频课程: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%之间,很难在有新的提升,在这种情况下就不是训练次数不够了,而是模型本身需要优化。

  1. 简单神经网络只有输入和输出,没有隐藏层,问题不能被拆分因此训练模型粗糙
  2. 如果物体本身比较复杂,例如人脸识别,那么很多时候我们应该把人脸进行拆分鼻子、嘴巴、耳朵… 这样就需要构建隐藏神经网络
  3. 如果一张图有很多的物体,那么我们应该把每个物体单独拿来处理,这个时候就会用到更高级的卷积神经网络

在这里插入图片描述

发布了128 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lsqzedu/article/details/102536721