AI数字识别

通过神经网络可以正确预测1-9的数字

  • 首先导入相应的包 Tensorflow后台 keras框架
import tensorflow as tf
from tensorflow import keras
import random
import numpy as np
  • 创建数据和标签列表
datas=[]
labellist=[]
  • 随机出五百个数据,分别放在datas和labellist中,数据就是数字1-9
for i in range(500):
    num = random.randrange(1,10)
    # np.zeros(shap=9) 代表创建一个用0.填充的numpy数组
    one_hot = np.zeros(shape=9)
    # 将数组中随机一位替换为1
    one_hot[num-1]=1
    # 将这个数组添加到datas和labellist中
    datas.append(one_hot)
    labellist.append(one_hot)
  • 查看下 datas 数据的格式
datas
[array([0., 0., 1., 0., 0., 0., 0., 0., 0.]),
 array([0., 0., 0., 1., 0., 0., 0., 0., 0.]),
 array([0., 0., 0., 0., 0., 1., 0., 0., 0.]),
 array([0., 0., 0., 0., 0., 1., 0., 0., 0.]),
 array([1., 0., 0., 0., 0., 0., 0., 0., 0.]),
 array([1., 0., 0., 0., 0., 0., 0., 0., 0.]),
 array([0., 0., 1., 0., 0., 0., 0., 0., 0.])]
  • keras 要求输入的是array格式,所以要将 datas和libellist转化为array
datas=np.array(datas)
labellist = np.array(labellist)
  • 再看下datas的格式 已经被numpy处理为array
datas
array([[0., 0., 1., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.]])
  • 设置log路径,方便后面分析用到
  • tf.keras.callbacks.TensorBoard的参数
    • log_dir:保存TensorBoard要解析的日志文件的目录路径。
    • histogram_freq:默认为0。计算模型各层的激活值和权重直方图的频率(以epoch计)。如果设置为0,将不会计算直方图。若想直方图可视化,必须指定验证数据(或分割验证集)。
log_dir = './logs'
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,histogram_freq=1)

  • 一个简单的三层网络
# input()这个方法是用来初始化一个keras tensor的
# tensor说白了就是个数组。他强大到之通过输入和输出就能建立一个keras模型。
# Keras张量是一个来自底层后端的张量对象(Theano或TensorFlow),
# 我们用某些属性来扩充它,这些属性允许我们通过知道模型的输入和输出来构建Keras模型。
# 这部分返回一个张量 定义输入
inputs = keras.layers.Input(shape=(9,))
# 层的实例是可调用的,它以张量为参数,并且返回一个张量
# Relu:近似生物神经激活函数
x = keras.layers.Dense(64,activation='relu')(inputs)
x = keras.layers.Dense(64,activation='relu')(x)
# softmax: 在多分类中常用的激活函数,是基于逻辑回归的。
# 定义输出
predictions = keras.layers.Dense(9,activation='softmax')(x)
# 这部分创建了一个包含输入层和三个全连接层的模型
model = keras.models.Model(inputs=inputs,outputs=predictions)

model

<tensorflow.python.keras.engine.functional.Functional at 0x1c14cc12be0>
  • 设置训练前的参数
model.compile(optimizer='sgd',loss=tf.keras.losses.CategoricalCrossentropy())


  • 开始训练
model.fit(datas,labellist,epochs=100,verbose=1,callbacks=[tensorboard_callback])

Epoch 1/100
 2/16 [==>...........................] - ETA: 0s - loss: 1.9050WARNING:tensorflow:Callbacks method `on_train_batch_begin` is slow compared to the batch time (batch time: 0.0000s vs `on_train_batch_begin` time: 0.0010s). Check your callbacks.
WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0000s vs `on_train_batch_end` time: 0.1005s). Check your callbacks.
16/16 [==============================] - 0s 8ms/step - loss: 1.8956
Epoch 2/100
16/16 [==============================] - 0s 2ms/step - loss: 1.8676
Epoch 3/100

<tensorflow.python.keras.callbacks.History at 0x1c179607f98>
  • 预测结果
for _ in range(10):
    num = random.randrange(1,10)
    one_hot = np.zeros(shape=9)
    one_hot[num-1]=1
    predict = np.argmax(model.predict(np.expand_dims(one_hot,axis=0))) + 1
    print('输入数字为:%d , 识别的数字为 %d' % (num,predict))

输入数字为:7 , 识别的数字为 7
输入数字为:5 , 识别的数字为 5
输入数字为:5 , 识别的数字为 5
输入数字为:3 , 识别的数字为 3
输入数字为:2 , 识别的数字为 2
输入数字为:8 , 识别的数字为 8
输入数字为:1 , 识别的数字为 1
输入数字为:5 , 识别的数字为 5
输入数字为:3 , 识别的数字为 3
输入数字为:5 , 识别的数字为 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值