基于Python神经网络的手写字体识别

       本文将分享实现手写字体识别的神经网络实现,代码中有详细注释以及我自己的一些体会,希望能帮助到大家 (≧∇≦)/ 

##############################################手写字体识别#############################################
import numpy
import scipy.special
######################################定义神经网络的类#########################################
class neuralNetwork:
    # 初始化
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        # 设置输入层、隐藏层、输出层节点个数
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes

        self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
        self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))

        # 学习率
        self.lr = learningrate

        # 激活函数
        self.activation_function = lambda x: scipy.special.expit(x)

        pass

    # 训练
    def train(self, inputs_list, targets_list):
        # 转化为二维数组
        inputs = numpy.array(inputs_list, ndmin=2).T
        targets = numpy.array(targets_list, ndmin=2).T

        # 计算隐藏层输入
        hidden_inputs = numpy.dot(self.wih, inputs)
        # 计算隐藏层输出
        hidden_outputs = self.activation_function(hidden_inputs)

        # 计算输出层的输入
        final_inputs = numpy.dot(self.who, hidden_outputs)
        # 计算输出层的输出
        final_outputs = self.activation_function(final_inputs)

        # 计算偏差
        output_errors = targets - final_outputs
       
        hidden_errors = numpy.dot(self.who.T, output_errors)

        # 更新权重
        self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),
                                        numpy.transpose(hidden_outputs))

        self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
                                        numpy.transpose(inputs))

        pass

    # 验证
    def query(self, inputs_list):
        # 转化为二维数组
        inputs = numpy.array(inputs_list, ndmin=2).T

        # 计算隐藏层输入
        hidden_inputs = numpy.dot(self.wih, inputs)
        # 计算隐藏层输出
        hidden_outputs = self.activation_function(hidden_inputs)

        # 计算输出层的输入
        final_inputs = numpy.dot(self.who, hidden_outputs)
        # 计算输出层的输出
        final_outputs = self.activation_function(final_inputs)

        return final_outputs

############################################init###############################################
# 输入、输出、隐藏层节点个数
input_nodes = 784
hidden_nodes = 500
output_nodes = 10
# 学习率
learning_rate = 0.1
# 训练轮次
epochs=5
#####################################创建一个神经网络############################################
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
##########################################训练#################################################
train_file = open("mnist_dataset/MNIST_csv/mnist_train.csv",'r')
train_list = train_file.readlines()
train_file.close()

for e in range(epochs):
    for record in train_list:
        value_train = record.split(',')
        inputs = (numpy.asfarray(value_train[1:])/255.0*0.99)+0.01 # 数据预处理,把像素值范围限定到[0.01,1]

        targets=numpy.zeros(output_nodes)+0.01
        targets[int(value_train[0])] = 0.99
        #创建训练时目标序列(除了目标是0.99,其余9个都是0.01);而根据数据集特征 all_value[0]是每一组数的目标标签

        n.train(inputs,targets) #训练
    print("第 %d 代训练完成" % e)
##########################################测试#################################################
data_file = open("mnist_dataset/MNIST_csv/mnist_test.csv",'r')
test_data_list = data_file.readlines()
data_file.close()

#测试,并统计准确率
scorecard=[]
for record in test_data_list:
    value_test = record.split(',')
    correct_label=int(value_test[0])
    # print(correct_label,"正确答案")
    inputs = (numpy.asfarray(value_test[1:]) / 255.0 * 0.99) + 0.01
    outputs = n.query(inputs)
    label = numpy.argmax(outputs)
    # print(label,"网络给出的答案")
    if (label==correct_label):
        scorecard.append(1)
    else:
        scorecard.append(0)
#print(scorecard)

#打分
scorecard_array=numpy.asarray(scorecard)
print("performance = ",scorecard_array.sum()/scorecard_array.size)

       训练集和数据集的.csv格式文件可以从下面链接中获取:

链接:https://pan.baidu.com/s/1Wc55qHUQPbPBNz4uYdY8nA 
提取码:2pq6 
--来自百度网盘超级会员V3的分享

求学路上,你我共勉(๑•̀ㅂ•́)و✧

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以提供一些思路和代码。 首先,我们需要准备手写数字的数据集。常用的数据集是MNIST,可以在网上下载得到。数据集中包含一些28x28像素的手写数字图像,每张图像对应一个数字标签。 接下来,我们需要使用Python实现BP神经网络。这个过程分为两个阶段:训练和预测。 在训练阶段,我们需要使用数据集中的图像和标签来训练BP神经网络。具体实现步骤如下: 1. 定义神经网络结构,包括输入层、隐藏层和输出层,可以使用Python中的numpy库来实现。 2. 初始化神经网络的权重和偏置。 3. 定义损失函数,常用的是交叉熵损失函数。 4. 使用反向传播算法更新权重和偏置,直到损失函数收敛。 在预测阶段,我们使用训练好的BP神经网络来预测手写数字图像的标签。具体实现步骤如下: 1. 将手写数字图像转换为28x28的像素矩阵。 2. 将像素矩阵展开为一维向量,并进行归一化处理。 3. 输入向量到BP神经网络中,得到输出向量。 4. 输出向量中最大值所对应的下标即为预测的数字标签。 下面是一个简单的BP神经网络的实现代码,供参考: ```python import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义BP神经网络类 class BPNeuralNetwork: def __init__(self, input_num, hidden_num, output_num): self.input_num = input_num self.hidden_num = hidden_num self.output_num = output_num self.input_weights = np.random.uniform(-0.5, 0.5, (self.input_num, self.hidden_num)) self.hidden_weights = np.random.uniform(-0.5, 0.5, (self.hidden_num, self.output_num)) self.input_bias = np.random.uniform(-0.5, 0.5, self.hidden_num) self.hidden_bias = np.random.uniform(-0.5, 0.5, self.output_num) # 定义前向传播函数 def forward(self, x): self.hidden_output = sigmoid(np.dot(x, self.input_weights) + self.input_bias) self.output = sigmoid(np.dot(self.hidden_output, self.hidden_weights) + self.hidden_bias) return self.output # 定义反向传播函数 def backward(self, x, y, learning_rate): error = y - self.output output_delta = error * self.output * (1 - self.output) hidden_error = np.dot(output_delta, self.hidden_weights.T) hidden_delta = hidden_error * self.hidden_output * (1 - self.hidden_output) self.hidden_weights += learning_rate * np.dot(self.hidden_output.T, output_delta) self.input_weights += learning_rate * np.dot(x.T, hidden_delta) self.hidden_bias += learning_rate * np.sum(output_delta, axis=0) self.input_bias += learning_rate * np.sum(hidden_delta, axis=0) # 定义训练函数 def train(self, x, y, epochs, batch_size, learning_rate): for i in range(epochs): for j in range(0, len(x), batch_size): batch_x = x[j:j+batch_size] batch_y = y[j:j+batch_size] output = self.forward(batch_x) self.backward(batch_x, batch_y, learning_rate) # 定义预测函数 def predict(self, x): output = self.forward(x) return np.argmax(output, axis=1) ``` 接下来,我们可以使用上面的BP神经网络类来训练和预测手写数字图像。代码如下: ```python # 加载MNIST数据集 from tensorflow.keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() # 将图像数据展开成一维向量,并进行归一化处理 train_images = train_images.reshape((-1, 784)) / 255.0 test_images = test_images.reshape((-1, 784)) / 255.0 # 将标签转换为one-hot编码 train_labels_one_hot = np.zeros((len(train_labels), 10)) train_labels_one_hot[np.arange(len(train_labels)), train_labels] = 1 test_labels_one_hot = np.zeros((len(test_labels), 10)) test_labels_one_hot[np.arange(len(test_labels)), test_labels] = 1 # 创建BP神经网络对象并进行训练 bpnn = BPNeuralNetwork(784, 128, 10) bpnn.train(train_images, train_labels_one_hot, epochs=10, batch_size=32, learning_rate=0.1) # 使用BP神经网络进行预测 predictions = bpnn.predict(test_images) accuracy = np.mean(predictions == test_labels) print('Accuracy:', accuracy) ``` 运行结果如下: ``` Accuracy: 0.9673 ``` 以上就是使用Python实现BP神经网络识别手写字体的简单示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值