神经网络——实现MNIST数据集的手写数字识别

2023-11-19

由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下

手写数字的数据集MNIST下载:https://download.csdn.net/download/gaoyu1253401563/10891997

数据集包含如下:

一、使用小规模数据集进行神经网络的训练和测试

数据集:

              mnist_train_100.csv   :100个样本

              mnist_test_10.csv       :10个样本

1、数据集分析

如下为mnist_train_100.csv开始的2-3行:

    存储数据的文件成为CSV文件,每一个吗值都是由逗号分隔,对于每行(最左边有行号)的数值,开头的第一个在值是标签,即书写 者希望表示的数字,如第一行的 “5”、第二行的 “0”。随后的784个值,由逗号分隔,是手写数字的像素值,像素数组的尺寸是28*28(即784),这784个像素值是手写数字的28*28的图片对应的784个位置的像素值。

注意:正常情况下0指的是黑色,255指的是白色,但是MNIST数据集使用相反的方式表示。

通过以下程序根据数据显示图片。

# 读入手写字体数据集(小数据集:mnist_train_100.csv)
import numpy as np
import matplotlib.pyplot as plt

data_file = open("mnist_dataset/mnist_train_100.csv", 'r')
data_list = data_file.readlines()
data_file.close()

all_values = data_list[1].split(',')
#np.asfarray()函数:返回转换为float类型的数组
image_array = np.asfarray(all_values[1:]).reshape((28,28))
plt.imshow(image_array, cmap = 'Greys', interpolation = 'None')


                            

 

2、数据集中数据的处理

   需要做的第一件事是将输入颜色值从较大的0到255的范围,缩放到较小的0.01到1.0的范围,选择0.01作为范围的最小值,是为了避免0值输入最终会造成权重更新的失败。

scaled_input = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
print(scaled_input)

输出结果如下:                             

[0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.208      0.62729412 0.99223529 0.62729412 0.20411765
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.19635294 0.934
 0.98835294 0.98835294 0.98835294 0.93011765 0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.21964706 0.89129412 0.99223529 0.98835294 0.93788235
 0.91458824 0.98835294 0.23129412 0.03329412 0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.04882353 0.24294118 0.87964706
 0.98835294 0.99223529 0.98835294 0.79423529 0.33611765 0.98835294
 0.99223529 0.48364706 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.64282353 0.98835294 0.98835294 0.98835294 0.99223529
 0.98835294 0.98835294 0.38270588 0.74376471 0.99223529 0.65835294
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.208      0.934
 0.99223529 0.99223529 0.74764706 0.45258824 0.99223529 0.89517647
 0.19247059 0.31670588 1.         0.66223529 0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.19635294 0.934      0.98835294 0.98835294 0.70494118
 0.05658824 0.30117647 0.47976471 0.09152941 0.01       0.01
 0.99223529 0.95341176 0.20411765 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.15752941 0.65058824
 0.99223529 0.91458824 0.81752941 0.33611765 0.01       0.01
 0.01       0.01       0.01       0.01       0.99223529 0.98835294
 0.65058824 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.03717647 0.70105882 0.98835294 0.94176471 0.28564706
 0.08376471 0.11870588 0.01       0.01       0.01       0.01
 0.01       0.01       0.99223529 0.98835294 0.76705882 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.23129412
 0.98835294 0.98835294 0.25458824 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.99223529 0.98835294 0.76705882 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.77870588 0.99223529 0.74764706
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       1.         0.99223529
 0.77094118 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.30505882 0.96505882 0.98835294 0.44482353 0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.99223529 0.98835294 0.58458824 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.34       0.98835294
 0.90294118 0.10705882 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.03717647 0.53411765
 0.99223529 0.73211765 0.05658824 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.34       0.98835294 0.87576471 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.03717647 0.51858824 0.98835294 0.88352941 0.28564706
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.34       0.98835294 0.57294118 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.19635294 0.65058824
 0.98835294 0.68164706 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.34388235 0.99223529
 0.88352941 0.01       0.01       0.01       0.01       0.01
 0.01       0.45258824 0.934      0.99223529 0.63894118 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.34       0.98835294 0.97670588 0.57682353
 0.19635294 0.12258824 0.34       0.70105882 0.88352941 0.99223529
 0.87576471 0.65835294 0.22741176 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.34       0.98835294 0.98835294 0.98835294 0.89905882 0.84470588
 0.98835294 0.98835294 0.98835294 0.77094118 0.51470588 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.11870588 0.78258824
 0.98835294 0.98835294 0.99223529 0.98835294 0.98835294 0.91458824
 0.57294118 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.10705882 0.50694118 0.98835294
 0.99223529 0.98835294 0.55741176 0.15364706 0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01      ]

 

3、构建目标矩阵

我们要求神经网络对图像进行分类,分配正确的标签,这些标签是0到9共10个数字中的一个,这意味着神经网络应该有10个输出层节点,每个节点对应一个可能的答案或标签,例如:如果答案是“0”,输出层第一个节点激发,而其余的输出节点则保持抑制状态。如下图所示:对于example“0”,可以看出输出层的最大信号来自于标签为“0”的节点,其余的输出节点产生非常小的信号输出。通常我们使用最大信号的输出节点对应的标签作为答案。

如果训练样本的标签为“0”,则需要创建输出节点的目标数组,其中除了对应于标签“0”的节点,其余所有的节点的值都应该很小,例如                       [0.99,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01] 

如下程序所示,根据目标数组,使用python实现目标数组

onodes = 10
targets = np.zeros(onodes) + 0.01
targets[int(all_values[0])] = 0.99
targets

输出结果如下:

 

4、神经网络的实现

  • 设计神经网络
import numpy as np
import scipy.special as S
import matplotlib.pyplot as plt
class neuralNetwork:
#初始化神经网络,构造函数
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        #设置每个输入、隐藏、输出层中的节点数(三层的神经网络)
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        
        #链接权重矩阵,wih和who
        # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
        # w11 w21
        # w12 w22 etc 
        self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
        self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
        
        #学习率
        self.lr = learningrate
        
        #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
        self.activation_function = lambda x: S.expit(x)
        
        pass
    
#训练神经网络
    def train(self, inputs_list, targets_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        targets = np.array(targets_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #计算隐藏层中输出的信号(使用激活函数计算)
        hidden_outputs = self.activation_function(hidden_inputs)
        #将传输的信号计算到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #计算输出层中输出的信号(使用激活函数)
        final_outputs = self.activation_function(final_inputs)
        
        #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
        output_errors = targets - final_outputs
        #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
        hidden_errors = np.dot(self.who.T, output_errors)
        
        #反向传播,更新各层权重
        #更新隐层和输出层之间的权重
        self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
        #更新输入层和隐藏层之间的权重
        self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
        #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
        pass
    
#查询神经网络:接受神经网络的输入,返回神经网络的输出
    def query(self, inputs_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #将信号从隐藏层输出
        hidden_outputs = self.activation_function(hidden_inputs)
        #将信号引入到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #将信号从输出层输出
        final_outputs = self.activation_function(final_inputs)
        
        #返回输出层的输出值
        return final_outputs
  • 初始化参数,类的实例化
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.3
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
  • 加载训练数据的CSV文件到程序中
training_data_file = open("mnist_dataset/mnist_train_100.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
  • 对网络进行训练
for record in training_data_list:
    all_values = record.split(',')
    inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
    targets = np.zeros(output_nodes) + 0.01
    targets[int(all_values[0])] = 0.99
    n.train(inputs, targets)
    pass
  • 测试训练后的神经网络模型
test_data_file = open("mnist_dataset/mnist_test_10.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
all_values = test_data_list[0].split(',')
image_array = np.asfarray(all_values[1:]).reshape((28,28))
plt.imshow(image_array, cmap='Greys', interpolation = 'None')
n.query((np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01)

测试的单个数据对应的数字: 

输出结果:

分析:由结果可知,节点的最大输出信号对应标签“7”,因此将此结果作为答案,即判断测试数据集中的这个手写数字是7。可以发现,这个结果不是太令人满意,因为答案对应的输出信号值不是很大,因为我们使用的数据集太小,因此进行二的实验。

 

二、完整数据集进行神经网络的训练和测试

数据集:

             mnist_train.csv      :60000个样本

              mnist_test.csv       :10000个样本

 

1、神经网络的设计

import numpy as np
import scipy.special as S
import matplotlib.pyplot as plt
class neuralNetwork:
#初始化神经网络,构造函数
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        #设置每个输入、隐藏、输出层中的节点数
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        
        #链接权重矩阵,wih和who
        # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
        # w11 w21
        # w12 w22 etc 
        self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
        self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
        
        #学习率
        self.lr = learningrate
        
        #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
        self.activation_function = lambda x: S.expit(x)
        
        pass
    
#训练神经网络
    def train(self, inputs_list, targets_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        targets = np.array(targets_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #计算隐藏层中输出的信号(使用激活函数计算)
        hidden_outputs = self.activation_function(hidden_inputs)
        #将传输的信号计算到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #计算输出层中输出的信号(使用激活函数)
        final_outputs = self.activation_function(final_inputs)
        
        #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
        output_errors = targets - final_outputs
        #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
        hidden_errors = np.dot(self.who.T, output_errors)
        
        #反向传播,更新各层权重
        #更新隐层和输出层之间的权重
        self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
        #更新输入层和隐藏层之间的权重
        self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
        #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
        pass
    
#查询神经网络:接受神经网络的输入,返回神经网络的输出
    def query(self, inputs_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #将信号从隐藏层输出
        hidden_outputs = self.activation_function(hidden_inputs)
        #将信号引入到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #将信号从输出层输出
        final_outputs = self.activation_function(final_inputs)
        
        #返回输出层的输出值
        return final_outputs

2、参数设置

input_nodes = 784
hidden_nodes = 200
output_nodes = 10
learning_rate = 0.3
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

3、导入mnist的训练数据集

 #将mnist的训练数据CSV文件加载到一个列表中
training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()

4、训练神经网络

#训练神经网络

#epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,
epochs = 5
for e in range(epochs):
    for record in training_data_list:
        all_values = record.split(',')
        inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
        targets = np.zeros(output_nodes) + 0.01
        targets[int(all_values[0])] = 0.99
        n.train(inputs, targets)
        pass
    pass

5、载入测试数据集

#将mnist测试数据的CSV文件加载到一个列表中
test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()

6、测试训练的模型

#scorecard用于记录训练好的神经网络在测试时的表现,初始为一个空列表
scorecard = []

#检测测试数据集中的所有数据
for record in test_data_list:
    all_values = record.split(',')
    correct_label = int(all_values[0])
    inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
    outputs = n.query(inputs)
    outputs_max_label = np.argmax(outputs)
    if (outputs_max_label == correct_label):
        scorecard.append(1)
    else:
        scorecard.append(0)
        pass
    pass

 

7、计算测试的得分

#计算得分
scorecard_array = np.asarray(scorecard)
print("performace = ", scorecard_array.sum() / scorecard_array.size)

结果:                                     

 

总结:训练和测试用时需要几分钟,可以见接下来的图,每次得分不同,这是因为,我们生成的链接权重矩阵是随机的,因此每次训练、测试最后的得分不同。

使用%%time计算训练和测试的时间如下(CPU环境下):

训练时间:Wall time: 6min 42s

测试时间: Wall time:1.86s

 

三、使用自己写的手写数字作为数据集进行网络的测试

 

1、对自己的手写数字进行数据的处理

import numpy as np
#python自带的库,主要用于读取和存储图像
import imageio 
#glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作
import glob
import matplotlib.pyplot as plt

#定义一个列表,存储自己手写数字的数据
our_own_dataset = []

#对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中
for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):
    print("loading...", image_file_name)
    #记录自己手写数字的正确标签
    label = int(image_file_name[-5:-4])
    #将图像数据从png文件加载到数组中
    img_array = imageio.imread(image_file_name, as_gray = True)
    #将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。
    img_data = 255.0 - img_array.reshape(784)
    img_data = (img_data / 255.0*0.99) + 0.01
    print(np.min(img_data))
    print(np.max(img_data))
    #将标签和对应的数据添加到测试数据中,即我们的数据集
    #np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度
    record = np.append(label,img_data)
    print(record)
    our_own_dataset.append(record)
    pass

 部分结果:

loading... my_own_dataset\2828_my_own_2.png
0.01
1.0
[2.         0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.07211765 0.52247059
 0.71658826 0.61952943 0.29729411 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.27400002 0.79423529 0.79423529 0.84470588 1.
 1.         0.59623533 0.01776471 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.23905884 0.70494121
 0.32835296 0.01       0.01       0.18858825 0.92235297 1.
 0.35552943 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.34388235 0.28952941 0.01       0.01
 0.01       0.01       0.50305885 1.         0.61176473 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.37105882 1.         0.61564708 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.43705884 1.
 0.42152941 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.68941176 0.86800003 0.09152941 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.21964706
 0.88741177 0.37494117 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01388235 0.68941176 0.55741179 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.46811765 0.63505882 0.02941176 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.36329412 0.68164706 0.09541176
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.27011764 0.69329411 0.12258823 0.01       0.01       0.01
 0.01       0.15752943 0.01776471 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.24294119 0.81364709 0.32447058
 0.01       0.01388235 0.02941176 0.14588237 0.64670593 0.4875294
 0.01388235 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.04882353
 0.46423531 1.         1.         1.         1.         1.
 1.         1.         1.         0.1847059  0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.08376471 0.46811765 0.5069412
 0.44482353 0.51082355 0.53023529 0.53023529 0.53023529 0.5069412
 0.29341176 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01      ]
loading... my_own_dataset\2828_my_own_3.png
0.01
1.0
[3.         0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.03329412
 0.12258823 0.01       0.44870588 0.61176473 0.56129414 0.23129413
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.27400002 0.60400003 0.80588233 0.46035293 0.01
 0.32058823 0.48364705 0.56905884 0.72435296 0.64282358 0.07600001
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.26235294
 0.5147059  0.23517647 0.02552941 0.01       0.01       0.01
 0.01       0.01       0.81752944 0.5147059  0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.21964706 0.08764706 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.62341177
 0.49529412 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.7515294  0.38658825 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.58847064 0.736      0.02164706 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.08376471 0.41764706 0.61952943 0.24682353 0.24294119 0.04882353
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.54576474 0.96117646
 1.         0.57682353 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.07600001 0.05270588 0.22352943 0.81364709
 0.59235299 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.05270588 0.37882352 0.32835296
 0.08376471 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.82141179 0.472      0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.35164705 0.55352944 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.05270588
 0.23517647 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.34       0.76705885 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.18082353 0.08764706 0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.02941176 0.87964708 0.5418824  0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.41764706 0.87964708 0.02552941 0.01       0.01
 0.01       0.01       0.01       0.01       0.13423531 0.42152941
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.53800005 0.79811764 0.11870588 0.01       0.01       0.08764706
 0.31282353 0.82917649 0.27788237 0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.53023529
 0.26235294 0.16917649 0.70494121 0.78258824 0.7282353  0.37105882
 0.02164706 0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.13035294
 0.31282353 0.14588237 0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01       0.01
 0.01       0.01       0.01       0.01       0.01      ]

 

2、基于自己数据的网络训练和测试

  • 设计神经网络
import numpy as np
import scipy.special as S
import matplotlib.pyplot as plt
#python自带的库,主要用于读取和存储图像
import imageio 
#glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作
import glob
class neuralNetwork:
#初始化神经网络,构造函数
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        #设置每个输入、隐藏、输出层中的节点数
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        
        #链接权重矩阵,wih和who
        # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
        # w11 w21
        # w12 w22 etc 
        self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
        self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
        
        #学习率
        self.lr = learningrate
        
        #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
        self.activation_function = lambda x: S.expit(x)
        
        pass
    
#训练神经网络
    def train(self, inputs_list, targets_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        targets = np.array(targets_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #计算隐藏层中输出的信号(使用激活函数计算)
        hidden_outputs = self.activation_function(hidden_inputs)
        #将传输的信号计算到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #计算输出层中输出的信号(使用激活函数)
        final_outputs = self.activation_function(final_inputs)
        
        #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
        output_errors = targets - final_outputs
        #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
        hidden_errors = np.dot(self.who.T, output_errors)
        
        #反向传播,更新各层权重
        #更新隐层和输出层之间的权重
        self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
        #更新输入层和隐藏层之间的权重
        self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
        #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
        pass
    
#查询神经网络:接受神经网络的输入,返回神经网络的输出
    def query(self, inputs_list):
        #将输入列表转换成二维数组
        inputs = np.array(inputs_list, ndmin = 2).T
        
        #将输入信号计算到隐藏层
        hidden_inputs = np.dot(self.wih, inputs)
        #将信号从隐藏层输出
        hidden_outputs = self.activation_function(hidden_inputs)
        #将信号引入到输出层
        final_inputs = np.dot(self.who, hidden_outputs)
        #将信号从输出层输出
        final_outputs = self.activation_function(final_inputs)
        
        #返回输出层的输出值
        return final_outputs
  • 设置参数

input_nodes = 784
hidden_nodes = 200
output_nodes = 10
learning_rate = 0.1
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
  • 加载训练数据集训练
 #将mnist的训练数据CSV文件加载到一个列表中
training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()

#训练神经网络
#epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,
epochs = 10
for e in range(epochs):
    for record in training_data_list:
        all_values = record.split(',')
        inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
        targets = np.zeros(output_nodes) + 0.01
        targets[int(all_values[0])] = 0.99
        n.train(inputs, targets)
        pass
    pass
  • 导入自己的数据集
#定义一个列表,存储自己手写数字的数据
our_own_dataset = []
#对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中
for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):
    #记录自己手写数字的正确标签
    label = int(image_file_name[-5:-4])
    #将图像数据从png文件加载到数组中
    img_array = imageio.imread(image_file_name, as_gray = True)
    #将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。
    img_data = 255.0 - img_array.reshape(784)
    img_data = (img_data / 255.0*0.99) + 0.01
    #将标签和对应的数据添加到测试数据中,即我们的数据集
    #np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度
    record = np.append(label,img_data)
    our_own_dataset.append(record)
    pass
  • 测试单个手写数字
#测试自己的手写数字数据集
item = 2
#显示图片
plt.imshow(our_own_dataset[item][1:].reshape(28,28), cmap = 'Greys', interpolation='None')
correct_label = our_own_dataset[item][0]
inputs = our_own_dataset[item][1:]

outputs = n.query(inputs)
print(outputs)

label = np.argmax(outputs)
print("network says ", label)
if (label == correct_label):
    print("match")
else:
    print("no match")
    pass
  • 测试结果 

其他测试结果:

                    

                       

 

四、提高识别正确率的改进方法

 

1、调整学习率

可以将学习率(learning_rate)调大或者调小,进行训练测试,看最后的等分情况,即识别准确率,本设计(3层神经网络与MNIST数据集)不同学习率的具体得分情况如下图所示:

可知,学习率在0.05到0.3之间可能会有较好的表现。个人训练的结果可能会有差异,因为代码运行的整个过程有一定的随机性。

 

2、增加一定的训练次数

增加一定的训练次数(也有人称训练一次为一个世代),可以提高训练模型的性能,从而提高后期测试时,模型的识别准确率。但值得注意的是:过多的训练,会使得网络出现过拟合现象,即网络过度拟合训练数据,从而降低训练出模型的识别准确率,这种过拟合现象在各种类型的机器学习中都会存在。

不同次数训练(不同数目的世代)下模型的识别准确率的结果可以参考下图:

 

尝试:可以同时改变学习率和训练次数进行尝试,但有一点需要明白的是:要正确、科学的得到最好的结果,需要为每个学习率和训练次数组合进行多次试验,尽量减小在梯度下降过程中随机性的影响,从而得到最优的结果。

 

 

3、改变网络结构

隐藏层节点前后的链接权重具有学习能力,可以试着改变中间隐藏层的节点数目,合理的进行改变,若设置为4,这样就不可能有足够的空间让网络去学习任何知识,将所有的输入转换成正确的输出。(这就想是让5L的瓶子盛50L的水一样,不能完成的任务)。

如果隐藏层的节点选取过多,例如10000个,此时有太多的路径供学习选择,因此难以训练网络,此需要设置更多的训练次数来训练网络,这样会大大加重计算的算力,耗时。

因此我们需要在可以容忍的运行时间内选择某个数目的隐藏层节点进行训练。本网络可参考下图:

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经网络——实现MNIST数据集的手写数字识别 的相关文章

  • Struts2知识汇总二

    Struts2中的调试 在Struts2中可以使用
  • java8 stream流排序

    原文出处 https www cnblogs com kuanglongblogs p 11230250 html 很多情况下sql不好解决的多表查询 临时表分组 排序 尽量用java8新特性stream进行处理 使用java8新特性 下面
  • Android PowerSupply (三)power_supply_sys

    目录 Android PowerSupply 一 总概 Android PowerSupply 二 power supply core Android PowerSupply 三 power supply sys Android Power

随机推荐

  • 深入理解ES6箭头函数中的this

    简要介绍 箭头函数中的this 指向与一般function定义的函数不同 比较容易绕晕 箭头函数this的定义 箭头函数中的this是在定义函数的时候绑定 而不是在执行函数的时候绑定 1 何为定义时绑定 我们来看下面这个例子 1 var x
  • UNIX环境高级编程读书笔记

    主要记录关键知识点 方便日后查阅 第一章 UNIX基础知识 UNIX体系结构 书中是这样画的 这篇文章认为这样画不合理https blog csdn net lyndon li article details 116956043 应该这样
  • jsp页面兼容谷歌浏览器相关问题

    1 js按键事件兼容 function document oncontextmenu ie8可运行 谷歌改为function document onkeydown 2 触发事件对象 IE浏览器支持window event srcElemen
  • [附源码]java+ssm计算机毕业设计java儿童福利院管理系统5d7wb【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • 变度量法算法(DFP)求解无约束问题

    程序功能 1 变度量法算法 DFP 求解无约束问题 2 调用文件夹下Newton的子函数 nfx ndfx ndfx2 vectorLength 3 z3 A i b 计算当前d的值 矩阵计算可能存在奇异值 4 请根据不同的目标函数 设置精
  • android- Cause: Unknown command-line option '-X'.

    问题太简单了 直接解决办法 File gt Settings gt Build Execution Deployment gt Compiler 删除Command line options里面的内容 重新gradle 感谢博主 欢迎留言指
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • 2022面试题汇总

    目录 浏览器下两个页面的通讯都有什么方式 使用css与js做一个九宫格动画 请输出如下的代码打印结果 js如何实现页面地址发生变化 但页面不发生跳转 请用js实现 请用多种方式实现垂直居中 实现的方式越多越好 请实现一个getValue函数
  • 【深度学习】全面直观认识深度神经网络

    01深度学习的精准定义 一类通过多层非线性变换对高复杂性数据建模算法的集合 它的两个非常重要的特征是多层性和非线性 俗称多层非线性变换 所以深度学习要去线性化 为什么呢 因为线性模型存在局限性 任意线性模型得到组合仍然还是线性模型 所以只要
  • Linux如何找回或者重置root用户密码

    欢迎参与个人独立开发的阅时即查web APP公测 请扫码体验 第一个为旧版 第二个为2019年6月版 在Linux这样一个权限管理严格 系统安全性要求高的环境中 根用户 超级用户 root的的密码显得十分重要 但是还是有一些马大哈会忘记自己
  • 【LLM】深入剖析 GOOGLE PALM 2:全面概述

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 用一维字符数组存放字符串

    一 用一维字符数组存放字符串 1 C语言对字符串的约定 字符串是借助于字符型一维数组来存放的 并规定以字符 0 作为字符串的结束标志 0 作为标志占用存储空间 但不计入串的实际常量 2 C语言中表示字符串常量的约定 虽然c语言中没有字符串数
  • regex_replace()函数的应用与解析

    include
  • lua报错 module 'Module' not found

    这几天学习lua使用require关键字获取自己定义的模块式 发现报没有这个模块文件 询问老师 老师说是因为中文路径问题 的确这个可能会出现问题 但是我修改后还是报这个错误 老师就让我看他的源代码 我确定没写错 所以还是要靠自己来解决了 终
  • 【sql语句基础】——查(select)(合并查询)

    目录 合并查询 单独查询 合并查询 UNION ALL UNION ALL定义 UNION ALL代码示例 UNION ALL查询结果 合并查询 UNION ALL UNION 定义 UNION 代码示例 UNION 查询结果 合并查询 当
  • Android Button 背景高度被拉伸问题

  • Linux音频之ASOC

    参考 https blog csdn net droidphone article details 7165482 1 ASOC简介 ASoC ALSA System on Chip 是建立在标准ALSA驱动层上 为了更好地支持嵌入式处理器
  • 第八章、Linux 磁盘与文件系统管理

    系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也不能太小 太大会造成磁盘容量的浪费 太小则会产生文件无法储存的困扰 此外 我们在前面几章谈到的文件权限与属性中 这些权限与属性分别记录在文件系统的哪个区块内 这就得
  • 贝叶斯网络学习

    状态空间搜索 如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程 通俗点说 两点之间求一线路 这两点是求解的开始和问题的结果 而这一线路不一定是直线 可以是曲折的 由于求解问题的过程中分枝有很多 主要是求解过程
  • 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢 因此提供便捷下载地址如下 手写数字的数据集MNIST下载 https download csdn net download gaoyu1253401563 10891997 数据集包含如下 一 使用小规模数