实战:用激活函数、Keras框架解决分类问题

文章目录

  • 实战:用激活函数、Keras框架解决分类问题
    • 介绍
    • 数据加载
    • 数据预处理
    • 模型设计
    • 模型编译
    • 模型训练
    • 模型评价
    • 总结

实战:用激活函数、Keras框架解决分类问题

介绍

本文将介绍如何使用激活函数和Keras框架解决分类问题。分类问题是机器学习中的一种基本问题,它的目标是将输入数据分为不同的类别。本文将以手写数字识别问题为例,介绍如何使用激活函数和Keras框架建立一个分类器,将手写数字分为0-9十个类别。

数据加载

首先,我们需要加载手写数字数据集MNIST。这个数据集包含60000个训练样本和10000个测试样本,每个样本是一个28x28的灰度图像,表示手写数字0-9之一。使用Keras框架,可以轻松地获取MNIST数据集:

from keras.datasets import mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()print('训练集大小:', x_train.shape, y_train.shape)
print('测试集大小:', x_test.shape, y_test.shape)

输出结果如下:

训练集大小: (60000, 28, 28) (60000,)
测试集大小: (10000, 28, 28) (10000,)

可以看到,训练集包含60000个样本,测试集包含10000个样本,每个样本是一个28x28的灰度图像。

数据预处理

在训练模型之前,我们需要对数据进行预处理。首先,将图像矩阵转化为一维向量,并将像素值归一化到0-1范围内。这可以通过以下代码实现:

import numpy as np# 将图像矩阵转化为一维向量
x_train = x_train.reshape((60000, 28 * 28))
x_test = x_test.reshape((10000, 28 * 28))# 将像素值归一化到0-1范围内
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255# 将类别标签转化为独热编码
from keras.utils import to_categoricaly_train = to_categorical(y_train)
y_test = to_categorical(y_test)print('训练集大小:', x_train.shape, y_train.shape)
print('测试集大小:', x_test.shape, y_test.shape)

这样处理之后,训练集和测试集的大小分别为(60000, 784)(10000, 784),类别标签也被转化为了独热编码。

模型设计

我们将使用Keras框架建立一个全连接神经网络来解决手写数字分类问题。这个神经网络包含一个输入层、两个隐藏层和一个输出层。其中隐藏层的大小是128,激活函数使用ReLU;输出层的大小是10(对应10个类别),激活函数使用softmax。这个神经网络可以用以下代码实现:

from keras import models
from keras import layersmodel = models.Sequential()
model.add(layers.Dense(128, activation='relu', input_shape=(784,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))print(model.summary())

这个神经网络的结构如下所示:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 128)               100480    
_________________________________________________________________
dense_2 (Dense)              (None, 128)               16512     
_________________________________________________________________
dense_3 (Dense)              (None, 10)                1290      
=================================================================
Total params: 118,282
Trainable params: 118,282
Non-trainable params: 0
_________________________________________________________________

可以看到,输入层的大小是784(对应28x28的图像向量化之后的大小),两个隐藏层的大小都是128,输出层的大小是10(对应10个类别)。

模型编译

在设计好模型之后,我们需要对模型进行编译。编译模型时,需要指定损失函数、优化器和评价指标。对于分类问题,常用的损失函数是交叉熵(categorical_crossentropy),常用的优化器是随机梯度下降(SGD),常用的评价指标是准确率(accuracy)。这可以使用以下代码实现:

model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])

模型训练

在编译好模型之后,我们可以用fit函数训练模型。fit函数需要指定训练集和测试集的输入和输出,批大小(batch size),训练轮数(epochs)等参数。这可以使用以下代码实现:

history = model.fit(x_train, y_train,batch_size=128,epochs=20,validation_data=(x_test, y_test))

这个模型将在训练集上进行20轮训练,每次随机选取128个样本进行训练。在每轮训练之后,模型将在测试集上进行测试,并记录训练和测试的损失和准确率。

模型评价

训练模型之后,我们可以用以下代码在测试集上评价模型的表现:

test_loss, test_acc = model.evaluate(x_test, y_test)print('测试集损失:', test_loss)
print('测试集准确率:', test_acc)

输出结果如下:

测试集损失: 0.10732187752056122
测试集准确率: 0.968600034236908

可以看到,这个模型在测试集上的准确率达到了96.86%。

我们还可以用以下代码绘制训练过程中的训练和测试损失和准确率曲线:

import matplotlib.pyplot as plthistory_dict = history.history
train_loss = history_dict['loss']
test_loss = history_dict['val_loss']
train_acc = history_dict['accuracy']
test_acc = history_dict['val_accuracy']epochs = range(1, len(train_loss) + 1)plt.plot(epochs, train_loss, 'bo', label='Training loss')
plt.plot(epochs, test_loss, 'b', label='Testing loss')
plt.title('Training and testing loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()plt.plot(epochs, train_acc, 'bo', label='Training accuracy')
plt.plot(epochs, test_acc, 'b', label='Testing accuracy')
plt.title('Training and testing accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

可以看到,随着训练轮数的增加,训练损失逐渐降低,训练准确率逐渐提高。然而,测试损失和测试准确率在训练了一定轮数之后开始出现反弹,这意味着模型已经开始出现过拟合。我们可以使用各种技术来解决过拟合问题,例如添加正则化项、使用dropout等。

总结

本文介绍了如何使用激活函数和Keras框架解决分类问题。我们以手写数字识别问题为例,介绍了如何使用Keras框架建立一个全连接神经网络,将手写数字分为0-9十个类别。我们还介绍了模型的编译、训练和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<el-input-number>显示两位数字;如果是一位数字的话前面补0

可以通过自定义 formatter 函数来实现。具体步骤如下&#xff1a; 在 <el-input-number> 上添加 :formatter 属性&#xff0c;值为 formatter 函数名。 在 methods 中定义 formatter 函数&#xff0c;该函数接收一个参数 value&#xff0c;表示当前输入框中的值。 在 f…

ElementUI浅尝辄止26:Notification 通知

悬浮出现在页面角落&#xff0c;显示全局的通知提醒消息。 1.如何使用&#xff1f; 适用性广泛的通知栏 //Notification 组件提供通知功能&#xff0c;Element 注册了$notify方法&#xff0c;接收一个options字面量参数&#xff0c;在最简单的情况下&#xff0c;你可以设置tit…

C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&a…

Java23种设计模式之【单例模式】

目录 一.单例模式的起源&#xff0c;和应用场景 1.单例模式的前世今生&#xff01; 2.什么是单例模式&#xff1f; 2.1使用单例模式的注意事项 2.2如何理解单例模式&#xff1f; 2.3单例模式的优势以及不足&#xff01; 2.4使用场景 二.实现 1.实现思路 1.1创建一个 S…

基于SSM的网络游戏公司官方平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

python实现zscore归一化和minmax标准化

zscore归一化&#xff1a; minmax from sklearn import preprocessing from sklearn.preprocessing import StandardScaler import numpy as np# 数据 x np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]]) print(----------------minmaxscaler标准化-------------) # 调用minma…

初始化一个 vite + vue 项目

创建项目 首先使用以下命令创建一个vite项目 npm create vite然后根据提示命令 cd 到刚创建的项目目录下&#xff0c;使用npm install安装所需要的依赖包&#xff0c;再使用npm run dev即可启动项目 配置 vite.config.js 添加process.env配置&#xff0c;如果下面 vue-route…

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…

Java认识异常(超级详细)

目录 异常的概念和体系结构 异常的概念 异常的体系结构 异常的分类 1.编译时异常 2.运行时异常 异常的处理 防御式编程 LBYL EAFP 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 异常的处理流程 异常的概念和体系结构 异常的概念 在Java中…

一篇文章教会你如何降低代码的冗余度——探索指针数组,数组指针,函数指针,函数指针数组,回调函数的奥妙

前言&#xff1a;人们总说指针是c语言的灵魂&#xff0c;是因为指针的使用技巧是“千姿百态”的&#xff0c;程序员可以通过指针来直接访问内存&#xff0c;这就赋予了它功能的多样性以及更多意想不到的编程技巧与方式&#xff0c;在本篇文章中&#xff0c;笔者就给大家带来指针…

嵌入式Linux驱动开发(LCD屏幕专题)(二)

一、结合APP分析LCD驱动程序 1、open app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 -------------------------------------------------------------- kernel:fb_open // fbmem.cstruct fb_info *info;info get_fb_info(fbidx);if (info->fbop…

关于B+树

在数据库管理系统中&#xff0c;使用b树作为索引的数据结构&#xff0c;相比于B树和二叉树&#xff0c;有以下几个好处&#xff1a; b树的非叶子节点只存储关键字和指针&#xff0c;不存储数据&#xff0c;这样可以增加每个节点的关键字数量&#xff0c;降低树的高度&#xff…

VB:顺序查找

VB&#xff1a;顺序查找 Private Sub Command1_Click()Dim i%, m%Dim x(1 To 10) As SingleFor i 1 To 10x(i) Val(InputBox("请输入"))Next im seqSearch(x, 10)If (m 1) ThenPrint "已找到"ElsePrint "未找到"End If End Sub Function se…

Altium 高级技巧 在扁平原理图中创建多个ROOM

Altium 的 ROOM 这个特性非常有用&#xff0c; 使用ROOM在编辑PCB时&#xff0c;可以很方便的整体拖动局部器件和电路图&#xff0c;为模块化电路设计提供便利 常规的设计模式应该采用垂直模式&#xff0c; 由顶层-中间层-底层&#xff0c; 顶层设计整体的框图连接&#xff…

插入排序(Java实现)

前言 稳定性&#xff1a;如果一个排序是稳定的&#xff0c;是可以变成不稳定的&#xff0c;此时这个排序归结为稳定&#xff0c;但是如果这个排序本身是不稳定的&#xff0c;是不可以变成稳定的&#xff0c;此时这个排序是不稳定的。 过程&#xff1a;如果数组中只有一个元素&a…

【JVM】synchronized锁升级的过程

目录 如何从无锁状态到偏向锁状态&#xff1a; 偏向锁升级为轻量级锁&#xff1a; 轻量级锁到自旋锁的状态&#xff1a; 自旋锁升级为重量级锁&#xff1a; 下面是自旋锁升级到重量级锁的过程&#xff1a; 重量级锁的特点如下&#xff1a; synchronized锁分为三种状态——…

点云从入门到精通技术详解100篇-基于几何特征的三维点云配准

目录 前言 研究现状 基于几何特征的方法 ICP算法及其变体 基于学习的方法

JavaSE【 String 类】(2)(

一、字符串的不可变性 1.String本身不可变 字符串修改 注意&#xff1a;尽量避免直接对 String 类型对象进行修改&#xff0c;因为 String 类是不能修改的&#xff0c;所有的修改都会创建新对象&#xff0c;效率 非常低下。 public static void main(String[] args) {/*** S…

sublime编辑latex 出现参考文献无法编译报错:citation “...” undefined

问题描述 使用sublime编译latex文件时&#xff0c;参考文献按照常规的方式放好&#xff0c;ctrl B 编译的时候&#xff0c;显示找不到参考文献&#xff0c;编译出的pdf文件也没有references&#xff1a; 但是把文件放到overleaf上就可以直接编译出来&#xff0c;说明是本地编…

向量数据库,能让AI再次起飞吗?

9月7-8日&#xff0c;深圳国际会展中心18号馆 来了&#xff0c;来了&#xff0c;腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会 -——- 腾讯全球数字生态大会。 9 月 7 日&#xff0c;我们将聚焦产业未来发展新趋势&#xff0c;针对云计算、大数据、人工…