神经网络字符分类

按照题目要求修改了多层感知机

题目将图片的每个点作为输入,其中大小为28*28,中间有两个大小为100的隐藏层,激活函数是relu,然后输出大小是10,激活函数是softmax

优化器是Adam,结合了AdaGrad和RMSProp算法的优点,为每个参数计算自适应的学习率。

损失函数是交叉熵损失的函数,通常用于分类问题,交叉熵损失函数衡量的是实际输出(probability distribution)与期望输出(true labels)的相似程度,在多分类问题中特别有用。

准确率(Accuracy)指标衡量的是模型预测正确的样本数与总样本数之间的比例。

epochs:训练的轮数5

batch_size:每次训练时使用的样本数量64

---------------------------------------------------------------------------------------------------------------------------------

本实践使用多层感知器训练(DNN)模型,用于预测手写数字图片。

本次实验主要考查以下内容 (1)尝试调整隐藏层单元数量、激活函数、隐藏层数量对于模型性能的影响 激活函数参照https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Overview_cn.html#activation-functional 或paddle.nn.functional (2)调整不同的训练的迭代轮次(epoch)、学习率、优化器并学会观察训练阶段与测试阶段loss变化,并依据此调整模型 优化器、学习率可参照https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/optimizer/Overview_cn.html (2)补全测试数据集上计算accuracy的过程,可以采用model下的evaluate,也可以利用predict之后的result结果进行计算 模型训练与评估相关API调用举例 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/Model_cn.html

首先导入必要的包

numpy---------->python第三方库,用于进行科学计算

PIL------------> Python Image Library,python第三方图像处理库

matplotlib----->python的绘图库 pyplot:matplotlib的绘图框架

os------------->提供了丰富的方法来处理文件和目录

#导入需要的包
import numpy as np
import paddle as paddle
import paddle.nn as nn
import paddle.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt
import paddle
from paddle.io import Dataset
import os
print("本教程基于Paddle的版本号为:"+paddle.__version__)
! python -m pip install visualdl -i https://mirror.baidu.com/pypi/simple

Step1:准备数据。

(1)数据集介绍

MNIST数据集包含60000个训练集和10000测试数据集。分为图片和标签,图片是28*28的像素矩阵,标签为0~9共10个数字。

(2)transform函数是定义了一个归一化标准化的标准

(3)train_dataset和test_dataset

paddle.vision.datasets.MNIST()中的mode='train'和mode='test'分别用于获取mnist训练集和测试集

transform=transform参数则为归一化标准

#导入数据集Compose的作用是将用于数据集预处理的接口以列表的方式进行组合。
#导入数据集Normalize的作用是图像归一化处理,支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。
from paddle.vision.transforms import Compose, Normalize
transform = Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])
# 使用transform对数据集做归一化
print('下载并加载训练数据')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
#print(np.array(test_dataset).shape)
print('加载完成')
#让我们一起看看数据集中的图片是什么样子的
train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1]
train_data0 = train_data0.reshape([28,28])
plt.figure(figsize=(2,2))
print(plt.imshow(train_data0, cmap=plt.cm.binary))
print('train_data0 的标签为: ' + str(train_label_0))
AxesImage(25,22;155x154)
train_data0 的标签为: [5]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:425: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_min = np.asscalar(a_min.astype(scaled_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/image.py:426: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  a_max = np.asscalar(a_max.astype(scaled_dtype))
#让我们再来看看数据样子是什么样的吧
print(train_data0)

Step2.网络配置

以下的代码判断就是定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层-->>隐层-->>隐层-->>输出层。

# 定义多层感知器  
#动态图定义多层感知器
class mnist(paddle.nn.Layer):
    def __init__(self):
        super(mnist,self).__init__()
        #输入通道784,输出通道100
        self.conv1=nn.Linear(in_features=784,out_features=100)
        #输入通道100,输出通道100
        self.conv2=nn.Linear(in_features=100,out_features=100)
        #输入通道100,输出通道10
        self.conv3=nn.Linear(in_features=100,out_features=10)


    def forward(self, input_):
        x = paddle.reshape(input_, [input_.shape[0], -1])
        # print(x.shape)[64, 784]
        y=F.relu(self.conv1(x))
        y=F.relu(self.conv2(y))
        y=F.softmax(self.conv3(y))
        return y

 


from paddle.metric import Accuracy

# 用Model封装模型
model = paddle.Model(mnist())   

# 定义损失函数
optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())

# 配置模型
model.prepare(optim,paddle.nn.CrossEntropyLoss(),Accuracy())

Step3.模型训练及评估

callback = paddle.callbacks.VisualDL(log_dir='visualdl_log_dir')
# 训练保存并验证模型
model.fit(train_dataset,test_dataset,epochs=5,batch_size=64,save_dir='multilayer_perceptron',verbose=1)

#模型预测
result = model.predict(test_dataset, batch_size=1)


#请补全模型性能验证代码,可使用model下的evaluate函数或者利用上面的预测出来的结果

model.evaluate(test_dataset,verbose=1)
test_data0, test_label_0 = test_dataset[0][0],test_dataset[0][1]

ress=model.predict_batch(test_data0)

test_data0 = test_data0.reshape([28,28])
plt.figure(figsize=(2,2))
#展示测试集中的第一个图片
print(plt.imshow(test_data0, cmap=plt.cm.binary))
print('test_data0 的标签为: ' + str(test_label_0))


print('test_data0 预测的数值为:' ,end='')
print(ress)

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络字符识别是一种利用机器学习技术来训练模型,从而识别和分类不同的字符、文字或是手写字体。Python是一种流行的编程语言,具有丰富的库和工具,非常适合用于神经网络的实现和训练。 在Python 中,我们可以使用诸如TensorFlow、Keras、PyTorch等深度学习框架来构建神经网络模型。首先,我们需要准备一个包含大量字符图片样本的数据集,这些样本可以是打印体字符、手写体字母或数字等。 接下来,我们可以使用Python中的图像处理库,如PIL或OpenCV等,对字符图片进行预处理,包括灰度化、大小调整、标准化等操作,以便将其转换为适合神经网络模型输入的格式。 然后,我们可以利用Python中的深度学习框架来构建一个字符识别的神经网络模型,可以选择不同的网络结构,如卷积神经网络(CNN)或循环神经网络(RNN),并根据需求调整模型的参数和层数。 接着,我们使用Python来训练这个神经网络模型,通过反向传播算法不断优化模型的权重和参数,使其能够准确地识别和分类不同的字符。 最后,我们可以使用Python来评估和测试训练好的神经网络模型,检查其在新的字符图片上的识别准确率,并对模型进行调优和改进。 总之,利用Python实现神经网络字符识别是一个高效而且灵活的方法,有助于我们快速构建和训练出高准确度的字符识别模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值