通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程。

本例子,要基于mnist数据集(该数据集包含了【0-9】的模型训练数据集和测试数据集)来完成一个手写数字识别的小demo。

mnist数据集,图片大小是28*28的黑白。包含了6w 训练数据和1w验证数据。

麻雀虽小五脏俱全。通过这个CV类型的demo需求,我们会学到神经网络模型。

从数据加载,到数据预处理,再到训练模型,保存模型。然后再通过模型来预测我们输入的图片数字。

通过整个过程下来,对于像我这样初识AI深度学习者来说,可以有一个非常好的体感。

我们通过keras+tensorflow2.0来上手。

数据加载

keras 框架,提供了现成的方法来获取mnist数据集

(x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()

这个方法会返回两组数据集

train_image,train_label ,训练数据集、分类标签

x_test_image, y_test_label,验证数据集、分类标签

要想让机器识别一个图片,需要对图片进行像素化,将像素数据转换成 张量 矩阵数据。

mnist.load_data() 返回的就是已经转换好的张量矩阵数据。

(在python中,通过NumPy多维数组表示。)

数据预处理

我们这个demo属于AI for CV 方向。

CV信息首先要像素化处理,拿到张量信息。

# 转换成一维向量 28*28=784
x_train = x_train_image.reshape(60000, 784)
x_test = x_test_image.reshape(10000, 784) # 标准化0-1
x_Test_normalize = x_test.astype('float32') / 255
x_Train_normalize = x_train.astype('float32') / 255

通过reshape方法将三维转换成二维,同时通过量化将计算数据缩小但是不影响模型训练识别。

(mnist图片数据是黑白,位深为8位,0-255表示像素信息)。

通过可视化,我们能大概看到图片的数字特征是怎么被感知到的。

同时将label标签数据转换成0-1的矩阵。

# 将训练集和测试集标签都进行独热码转化
y_TrainOneHot = np_utils.to_categorical(y_train_label)
y_TestOneHot = np_utils.to_categorical(y_test_label)

构建模型

# 建立Sequential 模型
model = Sequential()
# 建立输入层、隐藏层
model.add(Dense(units=256,input_dim=784,kernel_initializer='normal',activation='relu'))
# 建立输出层
model.add(Dense(units=10,kernel_initializer='normal',activation='softmax')) # 定义模型训练参数
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

定义神经网络模型参数。这里每一个参数都是一个非常深的学科,但是工程使用了解下就可以了。

训练模型

# 开始训练
train_history = model.fit(x=x_Train_normalize, y=y_TrainOneHot,
validation_split=0.2, epochs=10, batch_size=200, verbose=2)
# 显示训练过程
show_train_history(train_history, 'accuracy', 'val_accuracy')

随着训练次数不断增加,整个精确度也越来越高。

我们看下训练过程的日志。

Epoch 1/10
240/240 - 3s - loss: 0.1211 - accuracy: 0.8309 - val_loss: 0.0564 - val_accuracy: 0.9228 - 3s/epoch - 11ms/step
Epoch 2/10
240/240 - 1s - loss: 0.0492 - accuracy: 0.9312 - val_loss: 0.0392 - val_accuracy: 0.9470 - 831ms/epoch - 3ms/step
Epoch 3/10
240/240 - 1s - loss: 0.0360 - accuracy: 0.9495 - val_loss: 0.0313 - val_accuracy: 0.9570 - 890ms/epoch - 4ms/step
Epoch 4/10
240/240 - 1s - loss: 0.0286 - accuracy: 0.9598 - val_loss: 0.0278 - val_accuracy: 0.9610 - 900ms/epoch - 4ms/step
Epoch 5/10
240/240 - 1s - loss: 0.0239 - accuracy: 0.9675 - val_loss: 0.0243 - val_accuracy: 0.9679 - 1s/epoch - 5ms/step
Epoch 6/10
240/240 - 1s - loss: 0.0204 - accuracy: 0.9723 - val_loss: 0.0224 - val_accuracy: 0.9698 - 1s/epoch - 5ms/step
Epoch 7/10
240/240 - 1s - loss: 0.0177 - accuracy: 0.9772 - val_loss: 0.0210 - val_accuracy: 0.9714 - 1s/epoch - 4ms/step
Epoch 8/10
240/240 - 1s - loss: 0.0155 - accuracy: 0.9805 - val_loss: 0.0201 - val_accuracy: 0.9729 - 984ms/epoch - 4ms/step
Epoch 9/10
240/240 - 1s - loss: 0.0137 - accuracy: 0.9833 - val_loss: 0.0189 - val_accuracy: 0.9742 - 1s/epoch - 5ms/step
Epoch 10/10
240/240 - 1s - loss: 0.0122 - accuracy: 0.9861 - val_loss: 0.0182 - val_accuracy: 0.9751 - 975ms/epoch - 4ms/step

可以看到,每一轮训练,loss 的值在逐步变小,accuracy 在逐步增加。

每一次训练,模型中的损失函数在计算出一个参数给到优化器进行反向传播,不断的调整神经元的权重。

模型训练好之后,需要用测试数据集来验证模型的准确度。

scores = model.evaluate(x_Test_normalize, y_TestOneHot)
print('accuracy=', scores[1])
accuracy= 0.975600004196167

保存模型

mode.save()
model.save('model.h5') #也可以保存到具体的文件中

保存的模型里面具体是什么,了解神经网络原理之后,大概能明白。其实模型里最重要的是 神经元的权重值

这个demo的模型我放到这里了。

https://gitee.com/wangqingpei/blogimages/blob/master/mnist-helloworld/test/model-mnist/model.h5)

预测数据

我们准备几个手写的数字测试下。

读取本地图片文件

def get_local_image():
img = Image.open('3.png')
img = img.convert('L').resize((28, 28))
img_array = np.array(img)
# 将像素值转换为0-1之间的浮点数
img_array = img_array.astype('float32') / 255.0
img_array_result = np.reshape(img_array, (1, 784)) return img_array_result

加载模型进行预测

def autoNumberWord():
model = load_model("/Users/wangqingpei/Downloads/test/model-mnist/model.h5")
img = get_local_image()
prediction = model.predict(img)
prediction_result = np.argmax(prediction)
print('本地文件预测:', prediction_result)
240/240 - 1s - loss: 0.0130 - accuracy: 0.9843 - val_loss: 0.0183 - val_accuracy: 0.9755 - 848ms/epoch - 4ms/step
Epoch 10/10
240/240 - 1s - loss: 0.0116 - accuracy: 0.9866 - val_loss: 0.0177 - val_accuracy: 0.9761 - 873ms/epoch - 4ms/step
313/313 [==============================] - 1s 2ms/step - loss: 0.0167 - accuracy: 0.9767
accuracy= 0.9767000079154968
1/1 [==============================] - 0s 116ms/step
Backend MacOSX is interactive backend. Turning interactive mode on.
本地文件预测: 3

学会使用AI数字助手 chartGPT

在学习过程中,遇到问题要改变习惯,用chartGPT。~_~

在学习这个demo的时候,关于加载本地图片的地方我搞了半天不行,后来求助chartGPT,还是很方便的。





未来AI工具肯定是越来越产品化,易使用。

但是,要想跟AI对话,需要对特定的领域有一定的理解。Prompt Engineer 也一定是趋势。

keras图片数字识别入门AI机器学习的更多相关文章

  1. 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》

    首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...

  2. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  3. TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST)

    从这篇文章开始,终于要干点正儿八经的工作了,前面都是准备工作.这次我们要解决机器学习的经典问题,MNIST手写数字识别. 首先介绍一下数据集.请首先解压:TF_Net\Asset\mnist_png. ...

  4. mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)

    前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...

  5. 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

    7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...

  6. 机器学习初探(手写数字识别)HOG图片

    这里我们讲一下使用HOG的方法进行手写数字识别: 首先把 代码分享出来: hog1.m function B = hog1(A) %A是28*28的 B=[]; [x,y] = size(A); %外 ...

  7. 机器学习(二)-kNN手写数字识别

    一.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 1,距离可以是欧式距离,夹角余弦距离等等. 2,k值不能选择太大 ...

  8. 基于tensorflow的MNIST手写数字识别(二)--入门篇

    http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...

  9. 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

    参考:台大李宏毅老师视频课程-Keras-Demo 在载入数据阶段报错: ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接 Google之 ...

  10. 【机器学习】李宏毅机器学习-Keras-Demo-神经网络手写数字识别与调参

    参考: 原视频:李宏毅机器学习-Keras-Demo 调参博文1:深度学习入门实践_十行搭建手写数字识别神经网络 调参博文2:手写数字识别---demo(有小错误) 代码链接: 编程环境: 操作系统: ...

随机推荐

  1. 【Nday】Spring-Cloud-SpEL-表达式注入漏洞复现

    # 环境搭建 JDK 15下载:   https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html 在Cen ...

  2. 如何保证RabbitMQ不会被重复消费?

    为什么会有重复消费? 做一个标志! 在将生产者写消息的时候,对数据做一个唯一标识.消费者在消费消息时,根据这个唯一标识做判断,如果这个唯一标识被消费过了,那么就 不消费了,如果判断结果是没有被消费过, ...

  3. Maven常用参数及其说明

    Maven常用参数及其说明 -h,--help Display help information-am,--also-make 构建指定模块,同时构建指定模块依赖的其他模块;-amd,--also-m ...

  4. bzoj 2115

    线性基好题 首先,如果一条路径被经过了两次,那么这条路径上的权值等于没有(废话) 基于这一点,我们其实已经找到了解决问题的方法了! 首先,由于可以反复经过一条边,因此我们可以把一条合法的路径看成这样的 ...

  5. MySQL中的json函数

    json_valid 判断是否为合法json文档 json_unquote 去除json字符串的引号,将值转成string类型 json_extract 提取json值

  6. vue 封装时间格式化和number精确度

    //format.js 公用js /** * Parse the time to string * @param {(Object|string|number)} time * @param {str ...

  7. mysql零基础-3

    第17章_触发器 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的 ...

  8. 算法题:消除字符串中全部的b和连续的ac

    最近碰到了一道面试题,虽然不难但是临试没想出好的解法,记录下来以作分享. 题目:消除字符串中全部的b和连续的ac 用例: 'aabbc' -> 'a' 'aaabbbccc' -> '' ...

  9. 【摘】python和它的super

    python和它的super 如果用过python2,你一定见过下面这个奇怪的代码 class Mama(object): def says(self): print('i am mama') cla ...

  10. jetson nano 4gb记录

    常用命令 Ctrl alt t 打开终端gnome-session-properties 打开开机自启动管理界面 ifconfig 查看ip xrandr --fb 1200x800 调节分辨率 ll ...