如何用MLP实现Minist分类?
摘要:1. 数据集 minist手写体数字数据集 2. 代码 ''' Description: Author: zhangyh Date: 2024-05-04 15:21:
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 = dA
