MLP实现minist数据集分类任务
1. 数据集
minist手写体数字数据集
2. 代码
'''
Description:
Author: zhangyh
Date: 2024-05-04 15:21:49
LastEditTime: 2024-05-04 22:36:26
LastEditors: zhangyh
''' import numpy as np class MlpClassifier:
def __init__(self, input_size, hidden_size1, hidden_size2, output_size, learning_rate=0.01):
self.input_size = input_size
self.hidden_size1 = hidden_size1
self.hidden_size2 = hidden_size2
self.output_size = output_size
self.learning_rate = learning_rate self.W1 = np.random.randn(input_size, hidden_size1) * 0.01
self.b1 = np.zeros((1, hidden_size1))
self.W2 = np.random.randn(hidden_size1, hidden_size2) * 0.01
self.b2 = np.zeros((1, hidden_size2))
self.W3 = np.random.randn(hidden_size2, output_size) * 0.01
self.b3 = np.zeros((1, output_size)) def softmax(self, x):
exps = np.exp(x - np.max(x, axis=1, keepdims=True))
return exps / np.sum(exps, axis=1, keepdims=True) def relu(self, x):
return np.maximum(x, 0) def relu_derivative(self, x):
return np.where(x > 0, 1, 0) def cross_entropy_loss(self, y_true, y_pred):
m = y_true.shape[0]
return -np.sum(y_true * np.log(y_pred + 1e-8)) / m def forward(self, X):
self.Z1 = np.dot(X, self.W1) + self.b1
self.A1 = self.relu(self.Z1)
self.Z2 = np.dot(self.A1, self.W2) + self.b2
self.A2 = self.relu(self.Z2)
self.Z3 = np.dot(self.A2, self.W3) + self.b3
self.A3 = self.softmax(self.Z3)
return self.A3 def backward(self, X, y):
m = X.shape[0]
dZ3 = self.A3 - y
dW3 = np.dot(self.A2.T, dZ3) / m
db3 = np.sum(dZ3, axis=0, keepdims=True) / m
dA2 = np.dot(dZ3, self.W3.T)
dZ2 = dA2 * self.relu_derivative(self.Z2)
dW2 = np.dot(self.A1.T, dZ2) / m
db2 = np.sum(dZ2, axis=0, keepdims=True) / m
dA1 = np.dot(dZ2, self.W2.T)
dZ1 = dA1 * self.relu_derivative(self.Z1)
dW1 = np.dot(X.T, dZ1) / m
db1 = np.sum(dZ1, axis=0, keepdims=True) / m # Update weights and biases
self.W3 -= self.learning_rate * dW3
self.b3 -= self.learning_rate * db3
self.W2 -= self.learning_rate * dW2
self.b2 -= self.learning_rate * db2
self.W1 -= self.learning_rate * dW1
self.b1 -= self.learning_rate * db1 # 计算精确度
def accuracy(self, y_pred, y):
predictions = np.argmax(y_pred, axis=1)
correct_predictions = np.sum(predictions == np.argmax(y, axis=1))
return correct_predictions / y.shape[0] def train(self, X, y, epochs=100, batch_size=64):
print('Training...')
m = X.shape[0]
for epoch in range(epochs):
for i in range(0, m, batch_size):
X_batch = X[i:i+batch_size]
y_batch = y[i:i+batch_size] # Forward propagation
y_pred = self.forward(X_batch) # Backward propagation
self.backward(X_batch, y_batch) if (epoch+1) % 10 == 0:
loss = self.cross_entropy_loss(y, self.forward(X))
acc = self.accuracy(y_pred, y_batch)
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss}, Training-Accuracy: {acc}') def test(self, X, y):
print('Testing...')
y_pred = self.forward(X)
acc = self.accuracy(y_pred, y)
return acc if __name__ == '__main__': import tensorflow as tf # 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data() # 将图像转换为向量形式
X_train = X_train.reshape(X_train.shape[0], -1) / 255.0
X_test = X_test.reshape(X_test.shape[0], -1) / 255.0
# 将标签进行 one-hot 编码
num_classes = 10
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes) # 打印转换后的结果
# 训练集维度: (60000, 784) (60000, 10)
# 测试集维度: (10000, 784) (10000, 10)
model = MlpClassifier(784, 128, 128, 10) model.train(X_train, y_train) test_acc = model.test(X_test, y_test)
print(f'Test-Accuracy: {test_acc}')
3. 运行结果
Training...
Epoch 10/100, Loss: 0.3617846299623725, Training-Accuracy: 0.9375
Epoch 20/100, Loss: 0.1946690996652946, Training-Accuracy: 1.0
Epoch 30/100, Loss: 0.13053815227522408, Training-Accuracy: 1.0
Epoch 40/100, Loss: 0.09467908427578901, Training-Accuracy: 1.0
Epoch 50/100, Loss: 0.07120217251250453, Training-Accuracy: 1.0
Epoch 60/100, Loss: 0.055233734086591456, Training-Accuracy: 1.0
Epoch 70/100, Loss: 0.04369171830999816, Training-Accuracy: 1.0
Epoch 80/100, Loss: 0.03469674775956587, Training-Accuracy: 1.0
Epoch 90/100, Loss: 0.027861857647949812, Training-Accuracy: 1.0
Epoch 100/100, Loss: 0.0225212692988995, Training-Accuracy: 1.0
Testing...
Test-Accuracy: 0.9775
MLP实现minist数据集分类任务的更多相关文章
- 单向LSTM笔记, LSTM做minist数据集分类
单向LSTM笔记, LSTM做minist数据集分类 先介绍下torch.nn.LSTM()这个API 1.input_size: 每一个时步(time_step)输入到lstm单元的维度.(实际输入 ...
- 用CNN及MLP等方法识别minist数据集
用CNN及MLP等方法识别minist数据集 2017年02月13日 21:13:09 hnsywangxin 阅读数:1124更多 个人分类: 深度学习.keras.tensorflow.cnn ...
- 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化
一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ...
- Python实现鸢尾花数据集分类问题——基于skearn的NaiveBayes
Python实现鸢尾花数据集分类问题——基于skearn的NaiveBayes 代码如下: # !/usr/bin/env python # encoding: utf-8 __author__ = ...
- Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression
Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression 一. 逻辑回归 逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题, ...
- Python实现鸢尾花数据集分类问题——基于skearn的SVM
Python实现鸢尾花数据集分类问题——基于skearn的SVM 代码如下: # !/usr/bin/env python # encoding: utf-8 __author__ = 'Xiaoli ...
- BP算法在minist数据集上的简单实现
BP算法在minist上的简单实现 数据:http://yann.lecun.com/exdb/mnist/ 参考:blog,blog2,blog3,tensorflow 推导:http://www. ...
- TensorFlow笔记三:从Minist数据集出发 两种经典训练方法
Minist数据集:MNIST_data 包含四个数据文件 一.方法一:经典方法 tf.matmul(X,w)+b import tensorflow as tf import numpy as np ...
- 3.keras-简单实现Mnist数据集分类
keras-简单实现Mnist数据集分类 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.util ...
- 6.keras-基于CNN网络的Mnist数据集分类
keras-基于CNN网络的Mnist数据集分类 1.数据的载入和预处理 import numpy as np from keras.datasets import mnist from keras. ...
随机推荐
- 【开发者说】XstoryMaker快速书写剧本场景动画
原文:https://mp.weixin.qq.com/s/63V0dfD2IufbX92JeD-G_A,点击链接查看更多技术内容. [开发者说]栏目是为HarmonyOS开发者提供的展示和分享平台, ...
- docker 应用篇————docker 的文件系统[十]
前言 简单介绍一下docker的文件系统. 正文 docker 容器启动就是一个文件系统的启动. 在docker中,每一层镜像都具备一些文件. 比如说,有一个centos的镜像. 里面就是一个微小版的 ...
- 分享一款嵌入式开源按键框架代码工程MultiButton
一.工程简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块. Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只 ...
- 浅谈TypeScript对业务可维护性的影响
前言 笔者认为, TypeScript是服务于业务的, 核心就是提高代码的可维护性. TypeScript是把双刃剑, 如果类型系统使用的不好, 反而会阻碍开发, 甚至最后就变成了anyScript. ...
- 向量数据库Chroma学习记录
一 简介 Chroma是一款AI开源向量数据库,用于快速构建基于LLM的应用,支持Python和Javascript语言.具备轻量化.快速安装等特点,可与Langchain.LlamaIndex等知名 ...
- HarmonyOS NEXT应用开发案例——全屏登录页面
全屏登录页面 介绍 本例介绍各种应用登录页面. 全屏登录页面:在主页面点击跳转到全屏登录页后,显示全屏模态页面,全屏模态页面从下方滑出并覆盖整个屏幕,模态页面内容自定义,此处分为默认一键登录方式和其他 ...
- ModelScope初探:一行代码调用成熟AI模型。
简介: 如何用一行代码调用成熟AI模型?试试ModelScope,让AI开发者解放生产力! ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活.易用.低成本的一站式 ...
- 优化搜索排序结果从而“ 提升CTR、CVR业务指标”
简介: 搭建搜索功能不难,难的是如何提高搜索质量,帮助用户快速找到心中所想的内容或商品,那么搜索结果的相关性排序则是影响用户体验最关键的一环,本文通过阿里云开放搜索电商行业解决方案和大家聊一聊如何优化 ...
- 与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
简介:本次采访我将继续为大家详细讲解我的好伙伴:阿里巴巴的开源 Kubernetes 容器网络解决方案 hybridnet,以及我是如何借助它来构建混合云统一网络平面. 作者:若禾.昱晟.瑜佳 记者: ...
- 全球首款乘云而来的存储产品CDS诞生!
9月22日,阿里云发布全球首款"云定义存储"(Cloud Defined Storage,CDS)产品.作为一款本地部署的分布式存储产品,阿里云CDS拥有与公共云存储相同的技术架 ...