多个逻辑回归二分类器实现minist手写数字识别(Python 仅使用numpy实现)

该博客通过将多分类问题转化为10个二分类任务,利用Python和numpy实现逻辑回归模型,对手写数字进行识别。每个数字(0-9)训练一个模型,通过Sigmoid激活函数和交叉熵损失函数进行训练,并使用模型输出的概率值进行排序,选取最高概率对应的数字作为识别结果。文章还提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        多分类问题可以转换为多个二分类问题,例如,需要完成对手写数字的十分类时,可以采用依次对每个数字(0-9)进行二分类的方式,最终对每次分类中计算出的正样本概率值进行排序,选择概率最高的数字作为分类的结果。

      整个过程需要训练10个分类模型(0-9这十个数字每个数字训练一个分类模型),若模型的输入为数字x,则分别使用这10个模型对x进行分类,对每次分类的逻辑回归输出值(即正样本的概率)进行排序,取最大的值所对应的标签作为最终的分类结果。

        首先,采用Sigmoid函数作为逻辑回归的激活函数:

       

        代码实现如下:

def logistic(X):
    if(X>=0):
        return 1.0 / (1.0 + np.exp(-X))
    else:
        return np.exp(X)/(1.0 + np.exp(X))

       采用交叉熵作为损失函数,在二分类下,交叉熵损失函数如下:

        

         代码实现如下:

def cross_entropy(Y, P):
    Y = np.float_(Y)
    P = np.float_(P)
    return -np.sum(Y * np.log(P + 1e-10) + (1 - Y) * np.log(1 - P + 1e-10))

         L对权重w的偏导数为:(logistic -  y)* x , 其中logistic为前向传播经过Sigmoid函数激活后的值,其范围在0到1之间。

         L对偏置b的偏导数为:(logistic -  y)

         故在反向传播中,参数w和b的更新如下:

def backward(w,b,data,y,logistic,l_rate):
    for i in range(len(w)):
        w[i] -= l_rate * (logistic - y)*data[i]
    b -= l_rate * (logistic - y)
    return (w,b)

         其中l_rate为学习率

         模型的训练过程如下(每个训练样本更新一次权重,每个epoch执行一次评估):

de
很高兴听到您想要实现一个手写神经网络来识别minist手写数字。以下是一个基本的Python代码实现: 首先,我们需要导入必要的库: ```python import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data ``` 然后,我们需要加载minist数据集: ```python mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) ``` 接着,我们需要定义我们的神经网络模型。我们将使用一个三层的全连接网络,其中第一层有784个输入神经元(对应于MNIST图像的像素数量),第二层有256个隐藏神经元,第三层有10个输出神经元(对应于10个数字分类)。 ```python # 定义网络参数 n_input = 784 n_hidden_1 = 256 n_classes = 10 # 定义占位符 x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float", [None, n_classes]) # 定义权重和偏置 weights = { 'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 'out': tf.Variable(tf.random_normal([n_hidden_1, n_classes])) } biases = { 'b1': tf.Variable(tf.random_normal([n_hidden_1])), 'out': tf.Variable(tf.random_normal([n_classes])) } # 定义网络结构 def multilayer_perceptron(x, weights, biases): # 第一层隐藏层 layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) layer_1 = tf.nn.relu(layer_1) # 输出层 out_layer = tf.matmul(layer_1, weights['out']) + biases['out'] return out_layer # 定义模型 pred = multilayer_perceptron(x, weights, biases) ``` 然后,我们需要定义我们的损失函数和优化器。我们将使用交叉熵损失函数和Adam优化器。 ```python # 定义损失函数和优化器 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost) ``` 接下来,我们定义训练模型的参数。我们将使用100个批次,每个批次大小为128。 ```python # 定义训练参数 training_epochs = 100 batch_size = 128 display_step = 1 ``` 现在,我们可以开始训练我们的模型。我们将迭代训练数据集100次,并在每次迭代后计算损失和准确率。 ```python # 启动会话 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 训练循环 for epoch in range(training_epochs): avg_cost = 0. total_batch = int(mnist
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值