15-4-DNN-recognise-images-softmax.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from datasets import Datasets
  2. from exts import get_one_hot
  3. import tensorflow.compat.v1 as tf
  4. tf.disable_v2_behavior()
  5. # softmax回归算法
  6. def main():
  7. # 加载数据集
  8. train_data, vaild_data, test_data = Datasets.load_mnist()
  9. x_train, y_train = train_data
  10. x_test, y_test = test_data
  11. # one-hot编码又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有其独立的寄存器位,并且在任意时刻,其中只有一位有效。
  12. y_train = get_one_hot(y_train)
  13. y_test = get_one_hot(y_test)
  14. # 每次训练的数据子集的个数
  15. batch_size = 100
  16. # 设置占位符 x对应整个系统输入,是一个维度为784的向量集合,且长度不限制
  17. x = tf.placeholder("float", [None, 784])
  18. # y_整个系统的输出,对 应一个维度为10的向量集合
  19. y_ = tf.placeholder("float", [None, 10])
  20. # x的维度为784,所以W为一个784乘以10的数组
  21. W = tf.Variable(tf.zeros([784, 10]))
  22. # b是一个维度为10的向量
  23. b = tf.Variable(tf.zeros([10]))
  24. # 整个系统的操作函数(softmax回归算法)
  25. y = tf.nn.softmax(tf.matmul(x, W) + b)
  26. # 定义衰减函数,这里的衰减函数使用交叉熵来衡量,通过梯度下降算法以0.01的学习速率最小化交叉熵(训练模型)
  27. cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
  28. train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
  29. # 初始化全部变量并定义会话
  30. init = tf.initialize_all_variables()
  31. sess = tf.Session()
  32. sess.run(init)
  33. # 顺序取出100个数据用于训练
  34. for i in range(int(len(x_train) / batch_size)):
  35. batch_xs = x_train[(i * batch_size):((i + 1) * batch_size)]
  36. batch_ys = y_train[(i * batch_size):((i + 1) * batch_size)]
  37. sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  38. # 数据验证(评估我们的模型)
  39. correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  40. # 把布尔值转换成浮点数,然后取平均值
  41. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  42. print(sess.run(accuracy, feed_dict={x: x_test, y_: y_test})) # 0.9097
  43. if __name__ == "__main__":
  44. main()