10分钟搞定图形图像识别
Posted 网易云课堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10分钟搞定图形图像识别相关的知识,希望对你有一定的参考价值。
01
02
输入向量的维度和输入神经元的个数相同
每个连接都有权重
同一层神经元之间没有连接
神经元由:输入、隐藏、输出层组成
加载训练集图片
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# 这些图片并不是传统意义上的png或者jpg格式的图片,因为png或者jpg的图片格式,片会被处理成很简易的二维数组
mnist = input_data.read_data_sets("./input_data/",one_hot=True)
# 获取训练集 images.shape (55000, 784) 28*28=784,每行都是一张图片特征值
print(mnist.train.images)
# 打印第一张图,784个特征值的矩阵
print(mnist.train.images[0])
# 获取目标值矩阵 labels.shape (55000, 10) 10个权重
print(mnist.train.labels)
# 获取指定的n张图的特征值与目标值
print(mnist.train.next_batch(10))
03
TensorFlow图像识别
import tensorflow as tf
from tensorflow.examples.tutorials.mnist.input_data import read_data_sets
mnist = read_data_sets("../data/input_data", one_hot=True)
X = tf.placeholder(tf.float32, [None, 784],name="X")
y = tf.placeholder(tf.float32, [None, 10],name="y_true")
# 建立模型,初始化权重与偏置
weight =tf.Variable(tf.random.normal(shape=[784,10]),name="w")
# 如果设置为常量,则在训练模型时候bias不会改变
# bias = tf.constant(value=0.0,shape=[10],name="bias")
# 输出有10个连接点,因此需要设置10个偏置
bias = tf.Variable(tf.random.normal(shape=[10]),name="bias")
# 预测值None个样本输出的结果 [None,784] ==> [784,10] ==> [None,10] + [10]
y_predict = tf.matmul(X,weight) + bias
# 打印结果发现此公式可以取代上面的softmax + 交叉熵的计算
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_predict))
# 设置梯度下降的步长,一般0,1之间,步长越小则需要更多额训练次数,但是错过最小值机率也小
gdo = tf.train.GradientDescentOptimizer(0.5) # 0.05 0.1 0.5
train_op = gdo.minimize(loss)
print('求解模型的正确率')
arg1 = tf.argmax(y_predict,axis=1)
arg2 = tf.argmax(y,axis=1)
accuracy = tf.reduce_mean(tf.cast(tf.equal(arg1,arg2),tf.float16))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(2000):
mnist_x,mnist_y = mnist.train.next_batch(55)
d = {X:mnist_x,y:mnist_y}
# 每个样本返回1个预测值
sess.run(train_op,feed_dict=d)
print(f'训练第{i}次的正确率为{sess.run(accuracy,feed_dict=d)}')
else:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
guess = sess.run(y_predict, feed_dict=d)
# 把特征值,目标值,预测值封装到了一个list中
images_and_labels_and_guess = list(zip(mnist_x, mnist_y, guess))
# figsize:指定总图片的宽和高,单位为英寸, dpi缺省为80
plt.figure(figsize=(20, 18), dpi=200)
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
# index作为第一个参数,后面的值作为第二个参数,如果参数中有多个元组,会自动封装成一个元组
for index, (image, label, preidct) in enumerate(images_and_labels_and_guess):
# 每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域
plt.subplot(5, 11, index + 1)
# MNIST图片是一个784维的向量,我们重新把它还原为28x28维的图像
image = image.reshape(28, 28)
# plt.cm.gray_r 代表逆转的意思
plt.imshow(image, cmap=plt.cm.gray_r)
if index == 1:
print(label, preidct)
val_t, val_p = tf.argmax(label).eval(), tf.argmax(preidct).eval()
if val_t != val_p:
color = "#ff0000"
else:
color = "#000000"
plt.title(f'真:{val_t},预:{val_p}', fontsize=20, color=color)
plt.savefig("mnist.png")
plt.show()
图像识别效果演示
以上是关于10分钟搞定图形图像识别的主要内容,如果未能解决你的问题,请参考以下文章