4.2tensorflow多层感知器mlp识别手写数字最易懂实例代码(代码片段)

一字千金 一字千金     2022-11-30     485

关键词:

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

1.1  多层感知器MLP(multilayer perception)

1.1.1          多层感知器的结构

除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构。,假设输入层用向量X表示,则隐藏层的输出就是 f (W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f 可以是常用的sigmoid函数或者tanh函数。

 

 

 

 

1.1.2          激活函数

能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以利用到更多的非线性模型中。

(1) 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。

(2)激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。

(3)激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。

sigmod激活函数取值范围是(0,1),

 

 

 

 

导数为

 

 

 

 

tanh激活函数取值范围是(-1,1)

 

 

 

 

导数为

 

 

 

 

MLP所有的参数就是各个层之间的连接权重以及偏置,最简单的就是梯度下降法了(SGD):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等,最后得出参数,就是模型训练的过程。

1.1.3          tensorflow建立多层感知器的步骤

(1)定义手写数字数据获取类,用于下载数据和随机获取小批量训练数据。

(2)定义多层感知器,继承继承keras.Model,init函数定义层,call函数中组织数据处理流程。

(3)定义训练参数和模型对象,数据集对象。

(4)通过梯度下降法对模型参数进行训练,优化模型。

(5)用测试数据集评估模型的准确性

 

 

 

 

1.1.4          手写数字识别模型实例

下载60000个手写数字图片进行图像识别,识别出数字,用多层感知器去识别,用梯度下降法去训练模型参数。代码实例。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plot
#(1)定义手写数字数据获取类,用于下载数据和随机获取小批量训练数据
class MNISTLoader():
    def __init__(self):
        minist = tf.keras.datasets.mnist
        #训练数据x_train, 正确值y_train,测试数据x_test,测试数据正确值self.y_test
        (self.x_train, self.y_train), (self.x_test, self.y_test) = minist.load_data()
        #[60000,28,28,1],60000个28*28像素的图片数据,每个像素点时0-255的整数,除以255.0是将每个像素值归一化为0-1间
        #的浮点数,并通过np.expand_dims增加一维,作为颜色通道.默认值为1。
        self.x_train = np.expand_dims(self.x_train.astype(np.float) / 255.0, axis=-1)
        print(self.x_train.shape)
        #[10000,28,28]->[10000,28,28,1]
        self.x_test = np.expand_dims(self.x_test.astype(np.float) / 255.0, axis=-1)
        #训练用的标签值
        self.y_train = self.y_train.astype(np.int)
        #测试用的标签值
        self.y_test = self.y_test.astype(np.int)
        self.num_train_data = self.x_train.shape[0]
        self.num_test_data = self.x_test.shape[0]
    #随机从数据集中获取大小为batch_size手写图片数据
    def get_batch(self, batch_size):
        #shape[0]获取数据总数量,在0-总数量之间随机获取数据的索引值,相当于抽样。
        index = np.random.randint(0, self.x_train.shape[0], batch_size)
        #通过索引值去数据集中获取训练数据集。
        return self.x_train[index, :], self.y_train[index]
#(2)定义多层感知器,继承继承keras.Model,init函数定义层,call函数中组织数据处理流程
class MLP(tf.keras.Model):
    def __init__(self):
        super(MLP, self).__init__()
        #扁平化,将28*28的二维数组,变成1维数组,0-783.
        self.flatten = tf.keras.layers.Flatten()
        #全连接层,将784个像素点转化为100个
        self.dence1 = tf.keras.layers.Dense(units=100, activation=tf.nn.relu)
        #全连接层,将100个单元转化为10个点
        self.dence2 = tf.keras.layers.Dense(units=10)

    def call(self, inputs, training=None, mask=None):
        #编写数据流的处理过程,
        x = self.flatten(inputs)#28*28的二维矩阵扁平化为784个1维数组
        x = self.dence1(x)#784个映射到100个
        x = self.dence2(x)#100个映射到10个,分别表示对应0,1..9数字的概率
        output = tf.nn.softmax(x)#输出0,1..9概率最大的值。
        return output

#(3)定义训练参数和模型对象,数据集对象
num_epochs = 5
batch_size = 500#一批数据的数量
learning_rate = 0.001#学习率
model = MLP()#创建模型
data_loader = MNISTLoader()#创建数据源对象
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)#创建优化器,用于参数学习优化
#开始训练参数
num_batches=int(data_loader.num_train_data//batch_size*num_epochs)#计算训练数据的总组数
arryindex=np.arange(num_batches)
arryloss=np.zeros(num_batches)
#(4)通过梯度下降法对模型参数进行训练,优化模型
for batch_index in range(num_batches):
    X,ylabel=data_loader.get_batch(batch_size)#随机获取训练数据
    with tf.GradientTape() as tape:
        ypred=model(X)#模型计算预测值
        #计算损失函数
        loss=tf.keras.losses.sparse_categorical_crossentropy(y_true=ylabel,y_pred=ypred)
        #计算损失函数的均方根值,表示误差大小
        loss=tf.reduce_mean(loss)
        print("第%d次训练后:误差%f" % (batch_index,loss.numpy()))
        #保存误差值,用于画图
        arryloss[batch_index]=loss
        #根据误差计算梯度值
    grads=tape.gradient(loss,model.variables)
    #将梯度值调整模型参数
    optimizer.apply_gradients(grads_and_vars=zip(grads,model.variables))

#画出训练误差随训练次数的图片图
plot.plot(arryindex,arryloss,c=\'r\')
plot.show()
#(5)评估模型的准确性
#建立评估器对象
sparse_categorical_accuracy=tf.keras.metrics.SparseCategoricalAccuracy()
#用测试数据集计算预测值
ytestpred=model.predict(data_loader.x_test)
#向评估器输入预测值和真实值,计算准确率
sparse_categorical_accuracy.update_state(y_true=data_loader.y_test,y_pred=ytestpred)
print("test accuracy is %f" % sparse_categorical_accuracy.result())

 

 

训练误差收敛情况

 

 

 

 

输出评估分析结果,训练时误差是0.089,用测试数据进行测试准确性是0.955。

 

 

 

 

1.1.5          mlp使用知识点

(1)    expand_dims(a, axis) 给张量a,在位置axis处增加一个维度。

# \'t\' is a tensor of shape [2]

shape(expand_dims(t, 0)) ==> [1, 2]#在位置0处加

shape(expand_dims(t, 1)) ==> [2, 1]#在位置1处加

shape(expand_dims(t, -1)) ==> [2, 1]#默认在后面加

 

# \'t2\' is a tensor of shape [2, 3, 5]

shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]

shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]

shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]

(2)    tf.keras.layers.Flatten()将多维的张量转化为1维数组

将输入层的数据压成一维的数据,一般用再卷积层和全连接层之间(因为全连接层只能接收一维数据,而卷积层可以处理二维数据,就是全连接层处理的是向量,而卷积层处理的是矩阵。

(3)     x_train.shape[0],获取张量的维度,0表示第一个维度,也可以通过给shape赋值,改变张量的维度。

建立一个2*3*4的张量
>>> y = np.zeros((2, 3, 4))
>>> y.shape
(2, 3, 4)获取维度
>>> y.shape = (3, 8)#赋值维度
>>> y#输出y的值,变成3行8列的二维矩阵
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

(4)    tf.keras.layers.Dense全连接层

def __init__(self,

               units,

               activation=None,

               use_bias=True,

               kernel_initializer=\'glorot_uniform\',

               bias_initializer=\'zeros\',

               kernel_regularizer=None,

               bias_regularizer=None,

               activity_regularizer=None,

               kernel_constraint=None,

               bias_constraint=None,

               **kwargs)

units: 正整数,输出空间维度。

activation: 激活函数 (详见 activations)。 若不指定,则不使用激活函数 (即,线性激活: a(x) = x)。

use_bias: 布尔值,该层是否使用偏置向量。

kernel_initializer: kernel 权值矩阵的初始化器 (详见 initializers)。

bias_initializer: 偏置向量的初始化器 (详见 initializers)。

kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。

bias_regularizer: 运用到偏置向量的的正则化函数 (详见 regularizer)。

activity_regularizer: 运用到层的输出的正则化函数 (它的 "activation")。 (详见 regularizer)。

kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。

bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

 

(5)    tf.keras.optimizers.Adam参数优化器

keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)

Adam 优化器。

learning_rate: float >= 0. 学习率。

beta_1: float, 0 < beta < 1. 通常接近于 1。

beta_2: float, 0 < beta < 1. 通常接近于 1。

amsgrad: boolean. 是否应用此算法的 AMSGrad 变种,来自论文 "On the Convergence of Adam and Beyond"。

(6)    tf.keras.losses.sparse_categorical_crossentropy交叉熵函数

将模型的预测值和标签值传入计算损失函数的值,当预测概率分布和真实的概率分布越接近,交叉熵值越小,误差越小。

(7)    tf.keras.metrics.SparseCategoricalAccuracy()模型评估器

将测试数据输入模型得出预测值,通过调用update_state()方法向评估器输入y_pred和y_true两个参数,可以传入多次,最后调用result()函数输出总的预测的准确率。

手把手写深度学习:用最简单的神经网络多层感知机识别数字

前言:MLP多层感知机是多少人神经网络入门的初恋,这一讲从基础的多层感知机原理出发,搭建一个能够识别手写数字的MLP。众所周知,深度学习是一门工程学,我们从基础的MLP出发,一步一步手把手调参,在实践中感受调参的... 查看详情

tensorflow-多层感知机(mlp)(代码片段)

TensorFlow训练神经网络的4个步骤:1、定义算法公式,即训练神经网络的forward时的计算2、定义损失函数和选择优化器来优化loss3、训练步骤4、对模型进行准确率评测附Multi-LayerPerceptron代码:1fromtensorflow.examples.tutorials.mnistimportinput_... 查看详情

用pytorch实现多层感知机(mlp)(全连接神经网络fc)分类mnist手写数字体的识别(代码片段)

1.导入必备的包1importtorch2importnumpyasnp3fromtorchvision.datasetsimportmnist4fromtorchimportnn5fromtorch.autogradimportVariable6importmatplotlib.pyplotasplt7importtorch.nn.functionalasF8fromtorch.utils.da 查看详情

多层感知器识别手写数字算法程序(代码片段)

1#coding=utf-82#1.数据预处理3importnumpyasnp#导入模块,numpy是扩展链接库4importpandasaspd5importtensorflow6importkeras7fromkeras.utilsimportnp_utils8np.random.seed(10)#设置seed可以产生的随机数据9fromkeras.datasetsimportmnist#导入 查看详情

深度学习手写数字识别tensorflow2实验报告(代码片段)

实验一:手写数字识别一、实验目的利用深度学习实现手写数字识别,当输入一张手写图片后,能够准确的识别出该图片中数字是几。输出内容是0、1、2、3、4、5、6、7、8、9的其中一个。二、实验原理(1)采... 查看详情

多层感知器 (MLP) Keras 张量流模型

】多层感知器(MLP)Keras张量流模型【英文标题】:MultilayerPerceptron(MLP)Kerastensorflowmodel【发布时间】:2021-01-2913:14:31【问题描述】:我在为我的模型拟合训练后遇到了一个问题。下面是我的代码importpandasaspdimportmatplotlib.pyplotaspltfromsk... 查看详情

mlp多层感知器pytorch实现过程(代码片段)

...现过程中的内容与下文一致,实现过程中包括手写。多层感知机:Multi-LayerPerceptron多层感知机构建步骤:构建网络模型权重初始化前向传播计算损失反向传播求梯度更新权重1.构建网络模型多层神经网络中第一层称之... 查看详情

tfboy养成记多层感知器mlp

内容总结与莫烦的视频。这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层。代码的目的是你和一个二次曲线。同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声。添加层代码:defaddLayer(... 查看详情

基于多层感知机的手写数字识别(tensorflow实现)(代码片段)

importnumpyasnpimporttensorflowastffromtensorflow.examples.tutorials.mnistimportinput_dataimportosmnist=input_data.read_data_sets(‘MNIST_data‘,one_hot=True)classMNISTModel(object):def__init__(self,lr,batch_size,iter_num):self.lr=lrself.batch_size=batch_sizeself.iter_num=iter_num#定义模型结... 查看详情

mlp多层感知器pytorch实现过程(代码片段)

参考博客:https://blog.csdn.net/xholes/article/details/78461164https://www.pianshen.com/article/1392309515/代码github地址使用pytorch框架实现MLP。为了深入了解源码,没有使用pytorch中torch.nn.Module类和其它现有的方法,大部分功 查看详情

halcon多层感知器mlp的使用

参考技术Astep1:准备数据在图像选择区域作为训练集,可以是矩形,也可以是任意形状的区域。step2:创建一个MLPstep3:添加训练数据step4:查看训练样本数量(非必须)step5:训练step6:映射颜色表step7:使用step8:看效果参考:c... 查看详情

第二节,tensorflow使用前馈神经网络实现手写数字识别(代码片段)

一感知器    感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695    感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1。这种算法的局限... 查看详情

多层感知器实现:权重变得疯狂

】多层感知器实现:权重变得疯狂【英文标题】:Multilayerperceptronimplementation:weightsgocrazy【发布时间】:2013-08-0205:14:36【问题描述】:我正在编写具有单个输出单元(二进制分类)的MLP的简单实现。我需要它用于教学目的,所以... 查看详情

sigmoid 感知器失败的学习算法 - 手写识别

】sigmoid感知器失败的学习算法-手写识别【英文标题】:LearningalgorithmforsigmoidPerceptronfailing-Handwritingrecognition【发布时间】:2015-05-0913:23:07【问题描述】:我正在尝试使用Java中的MNIST数据库,使用单层感知器进行手写识别。每个感... 查看详情

mlp多层感知机网络——bpn反向传播神经网络

...反向传播神经网络是对非线性可微分函数进行权值训练的多层网络,是前向神经网络的一种。BP网络主要用于:1)函数逼近与预测分析:用输入矢量和相应的输出矢量训练一个网络,逼近一个函数或预测未知信息;2)模式识别:用... 查看详情

基于halcon的mlp(多层感知神经网络)分类器分类操作实例

...超平面作为分类平面。神经网络可能是单层的,也可能是多层的。如果特征向量不是线性可分的,则可以使用更多层的神经网络。    MLP神经网络主要由输入层、隐藏层、输出层构成。当隐藏层只有一层时,该网络... 查看详情

(数据科学学习手札44)在keras中训练多层感知机(代码片段)

...简介  Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度学习框架中的sklearn,本文就将基... 查看详情

具有意外预测的 tflearn 多层感知器

】具有意外预测的tflearn多层感知器【英文标题】:tflearnmultilayerperceptronwithunexpectedprediction【发布时间】:2017-06-2818:30:30【问题描述】:我想重建一个我首先使用scikit-learn的MLPRegressor和tflearn实现的MLP。sklearn.neural_network.MLPRegressor... 查看详情