神经网络代码实现(用手写数字识别数据集实验)

news2024/12/30 1:36:19

目录

一、前言

二、神经网络架构

三、算法实现

         1、导入包

         2、实现类

         3、训练函数

        4、权重参数矩阵初始化

        5、参数矩阵变换向量

         6、向量变换权重参数矩阵

         7、进行梯度下降

                7.1、损失函数

                        7.1.1、前向传播

                7.2、反向传播

        8、预测函数

四、完整代码

 五、手写数字识别


一、前言

        读者需要了解神经网络的基础知识,可以参考神经网络(深度学习,计算机视觉,得分函数,损失函数,前向传播,反向传播,激活函数)

        本文为大家详细的描述了,实现神经网络的逻辑,代码。并且用手写识别来实验,结果基本实现了神经网络的要求。

二、神经网络架构

        想一想:

        1.输入数据:特征值(手写数字识别是像素点,784个特征)

        2.W1,W2,W3矩阵的形状

        3.前向传播

        4.激活函数(用Sigmoid)

        5.反向传播

        6.偏置项

        7.损失(\hat{y}-y)

        8.得出W1,W2,W3对损失有多大影响,公式如下:

        \begin{matrix} \delta(4)=a(4)-y\\ \delta(3)=(\Theta ^3)^T\delta(4)*g'(z^{(3)})\\ \delta(2)=(\Theta ^2)^T\delta(3)*g'(z^{(2)})\\ \delta(1) =is \; for\;input\;layer,\;we\;can't\;change\;it\\ g'-sigmoid\;gradient\\ g'(z)=\frac{\partial }{\partial z}g(z)=g(z)(1-g(z));\;where\;g(z)=\frac{1}{1+e^{-z}} \end{matrix}

        算法流程(简便版):

        \begin{matrix} for\;i=1\;to\;m\\ \;set\;a(1)=x^{(i)}\\ perform\;forward\;propagation\;to\;compute\;a(1)\;for\;l=2,3...L\\ Using\;y^{(i)},compute\;\delta(L)=a^{(l)}-y^{(i)}\\ compute\;\delta(L-1)\;\delta(L-2)...\delta(2)\\ \Delta _{ij}^{(l)}:\Delta _{ij}^{(l)}+a_{j}^{(l)}\delta_i^{(l+1)}(or\;in\;vectorized\;form\;\Delta^{(l)}=\Delta^{(l)}+\delta^{(l+1)}(a(l))^T) \end{matrix}

         

三、算法实现

         1、导入包

import  numpy as np
from Neural_Network_Lab.utils.features import prepare_for_training
from Neural_Network_Lab.utils.hypothesis import sigmoid,sigmoid_gradient

           这里utils包用来封装数据预处理,和Sigmoid函数

          数据预处理:


import numpy as np
from .normalize import normalize


def generate_polynomials(dataset, polynomial_degree, normalize_data=False):
    """变换方法:
    x1, x2, x1^2, x2^2, x1*x2, x1*x2^2, etc.
    """

    features_split = np.array_split(dataset, 2, axis=1)
    dataset_1 = features_split[0]
    dataset_2 = features_split[1]

    (num_examples_1, num_features_1) = dataset_1.shape
    (num_examples_2, num_features_2) = dataset_2.shape

    if num_examples_1 != num_examples_2:
        raise ValueError('Can not generate polynomials for two sets with different number of rows')

    if num_features_1 == 0 and num_features_2 == 0:
        raise ValueError('Can not generate polynomials for two sets with no columns')

    if num_features_1 == 0:
        dataset_1 = dataset_2
    elif num_features_2 == 0:
        dataset_2 = dataset_1

    num_features = num_features_1 if num_features_1 < num_examples_2 else num_features_2
    dataset_1 = dataset_1[:, :num_features]
    dataset_2 = dataset_2[:, :num_features]

    polynomials = np.empty((num_examples_1, 0))

    for i in range(1, polynomial_degree + 1):
        for j in range(i + 1):
            polynomial_feature = (dataset_1 ** (i - j)) * (dataset_2 ** j)
            polynomials = np.concatenate((polynomials, polynomial_feature), axis=1)

    if normalize_data:
        polynomials = normalize(polynomials)[0]

    return polynomials

        Sigmoid函数:

import numpy as np


def sigmoid(matrix):
    """Applies sigmoid function to NumPy matrix"""

    return 1 / (1 + np.exp(-matrix))

         2、实现类

        多层感知机 初始化:数据,标签,网络层次(用列表表示如三层[784,25,10]表示输入层784个神经元,25个隐藏层神经元,10个输出层神经元),数据是否标准化处理。

class MultilayerPerceptron:
    def __init__(self,data,labels,layers,normalize_data=False):
        data_processed = prepare_for_training(data,normalize_data=normalize_data)[0]
        self.data = data_processed
        self.labels = labels
        self.layers = layers #  [  784 ,25 ,10]
        self.normalize_data = normalize_data
        self.thetas = MultilayerPerceptron.thetas_init(layers)

         3、训练函数

        输入迭代次数,学习率,进行梯度下降算法,更新权重参数矩阵,得到最终的权重参数矩阵,和损失值。矩阵不好进行更新操作,可以把它拉成向量。

    def train(self,max_ietrations = 1000,alpha = 0.1):
        #方便矩阵更新 拉长  把矩阵拉成向量
        unrolled_theta = MultilayerPerceptron.thetas_unroll(self.thetas)
        (optimized_theta, cost_history) = MultilayerPerceptron.gradient_descent(self.data,self.labels,unrolled_theta,self.layers,max_ietrations,alpha)
        self.thetas = MultilayerPerceptron.thetas_roll(optimized_theta,self.layers)

        return self.thetas,cost_history

        4、权重参数矩阵初始化

        根据网络层次可以确定,矩阵的大小,用字典存储。

    @staticmethod
    def thetas_init(layers):
        num_layers = len(layers)
        thetas = {} #用字典形式 key:表示第几层 vlues:权重参数矩阵
        for layer_index in range(num_layers-1):
            '''
            会执行两次: 得到两组参数矩阵 25 * 785 , 10 * 26
            '''
            in_count = layers[layer_index]
            out_count = layers[layer_index+1]
            #初始化 初始值小
            #这里需要考虑偏置项,偏置的个数与输出的个数一样
            thetas[layer_index]=np.random.rand(out_count,in_count+1) * 0.05 #加一列输入特征
        return thetas

        5、参数矩阵变换向量

        将权重参数矩阵变换成向量

    @staticmethod
    def thetas_unroll(thetas):
        #拼接成一个向量
        num_theta_layers = len(thetas)
        unrolled_theta = np.array([])
        for theta_layer_index in range(num_theta_layers):
            unrolled_theta = np.hstack((unrolled_theta,thetas[theta_layer_index].flatten()))
        return unrolled_theta

         6、向量变换权重参数矩阵

        后边前向传播时需要进行矩阵乘法,需要变换回来

    @staticmethod
    def thetas_roll(unrolled_theta,layers):
        num_layers = len(layers)
        thetas = {}
        unrolled_shift = 0
        for layer_index in range(num_layers - 1):
            in_count = layers[layer_index]
            out_count = layers[layer_index + 1]

            thetas_width = in_count + 1
            thetas_height = out_count
            thetas_volume = thetas_width * thetas_height
            start_index = unrolled_shift
            end_index =unrolled_shift + thetas_volume
            layer_theta_unrolled = unrolled_theta[start_index:end_index]
            thetas[layer_index] = layer_theta_unrolled.reshape((thetas_height,thetas_width))
            unrolled_shift = unrolled_shift + thetas_volume

        return thetas

         7、进行梯度下降

                1. 损失函数,计算损失值

                2. 计算梯度值

                3. 更新参数

                那么得先要实现损失函数,计算损失值。

                7.1、损失函数

                        实现损失函数,得到损失值得要实现前向传播走一次

                        7.1.1、前向传播
    @staticmethod
    def feedforword_propagation(data,thetas,layers):
        num_layers = len(layers)
        num_examples = data.shape[0]
        in_layer_activation = data #输入层

        #逐层计算 隐藏层
        for layer_index in range(num_layers - 1):
            theta = thetas[layer_index]
            out_layer_activation = sigmoid(np.dot(in_layer_activation,theta.T)) #输出层
            # 正常计算之后是num_examples * 25 ,但是要考虑偏置项 变成num_examples * 26
            out_layer_activation = np.hstack((np.ones((num_examples,1)),out_layer_activation))
            in_layer_activation = out_layer_activation

        #返回输出层结果,不要偏置项
        return in_layer_activation[:,1:]

                损失函数:

    @staticmethod
    def cost_function(data,labels,thetas,layers):
        num_layers = len(layers)
        num_examples = data.shape[0]
        num_labels = layers[-1]
        #前向传播走一次
        predictions = MultilayerPerceptron.feedforword_propagation(data,thetas,layers)
        #制作标签,每一个样本的标签都是one-dot
        bitwise_labels = np.zeros((num_examples,num_labels))
        for example_index in range(num_examples):
            bitwise_labels[example_index][labels[example_index][0]] = 1
        #咱们的预测值是概率值y= 7 [0,0,0,0,0,0,1,0,0,0]    在正确值的位置上概率越大越好 在错误值的位置上概率越小越好
        bit_set_cost = np.sum(np.log(predictions[bitwise_labels == 1]))
        bit_not_set_cost = np.sum(np.log(1 - predictions[bitwise_labels == 0]))
        cost = (-1/num_examples) * (bit_set_cost+bit_not_set_cost)
        return cost

                7.2、反向传播

                在梯度下降的过程中,要实现参数矩阵的更新,必须要实现反向传播。利用上述的公式,进行运算即可得到。

    @staticmethod
    def back_propagation(data,labels,thetas,layers):
        num_layers = len(layers)
        (num_examples,num_features) = data.shape
        num_label_types = layers[-1]

        deltas = {} # 算出每一层对结果的影响
        #初始化
        for layer_index in  range(num_layers - 1):
            in_count = layers[layer_index]
            out_count = layers[layer_index + 1]
            deltas[layer_index] = np.zeros((out_count,in_count+1)) #25 * 785 10 *26

        for example_index in range(num_examples):
            layers_inputs = {}
            layers_activations = {}
            layers_activation = data[example_index,:].reshape((num_features,1))
            layers_activations[0] = layers_activation

            #逐层计算
            for layer_index in range(num_layers - 1):
                layer_theta = thetas[layer_index]  #得到当前的权重参数值 : 25 *785 10 *26
                layer_input = np.dot(layer_theta,layers_activation) # 第一次 得到 25 * 1 第二次: 10 * 1
                layers_activation = np.vstack((np.array([[1]]),sigmoid(layer_input))) #完成激活函数,加上一个偏置参数
                layers_inputs[layer_index+1] = layer_input # 后一层计算结果
                layers_activations[layer_index +1] = layers_activation # 后一层完成激活的结果
            output_layer_activation = layers_activation[1:,:]
            #计算输出层和结果的差异
            delta = {}
            #标签处理
            bitwise_label = np.zeros((num_label_types,1))
            bitwise_label[labels[example_index][0]] = 1
            #计算输出结果和真实值之间的差异
            delta[num_layers-1] = output_layer_activation - bitwise_label #输出层

            #遍历 L,L-1,L-2...2
            for layer_index in range(num_layers - 2,0,-1):
                layer_theta = thetas[layer_index]
                next_delta = delta[layer_index+1]
                layer_input = layers_inputs[layer_index]
                layer_input = np.vstack((np.array((1)),layer_input))
                #按照公式计算
                delta[layer_index] = np.dot(layer_theta.T,next_delta)*sigmoid(layer_input)
                #过滤掉偏置参数
                delta[layer_index] = delta[layer_index][1:,:]

            #计算梯度值
            for layer_index in  range(num_layers-1):
                layer_delta = np.dot(delta[layer_index+1],layers_activations[layer_index].T)  #微调矩阵
                deltas[layer_index] = deltas[layer_index] + layer_delta #第一次25 * 785 第二次 10 * 26

        for layer_index in range(num_layers-1):
            deltas[layer_index] = deltas[layer_index] * (1/num_examples) #公式

        return deltas

        实现一次梯度下降:

    @staticmethod
    def gradient_step(data,labels,optimized_theta,layers):
        theta = MultilayerPerceptron.thetas_roll(optimized_theta,layers)
        #反向传播BP
        thetas_rolled_gradinets = MultilayerPerceptron.back_propagation(data,labels,theta,layers)
        thetas_unrolled_gradinets = MultilayerPerceptron.thetas_unroll(thetas_rolled_gradinets)
        return thetas_unrolled_gradinets

         实现梯度下降:

    @staticmethod
    def gradient_descent(data,labels,unrolled_theta,layers,max_ietrations,alpha):
        #1. 计算损失值
        #2. 计算梯度值
        #3. 更新参数
        optimized_theta = unrolled_theta #最好的theta值
        cost_history = []  #损失值的记录
        for i in range(max_ietrations):
            if i % 10 == 0 :
                print("当前迭代次数:",i)
            cost  = MultilayerPerceptron.cost_function(data,labels,MultilayerPerceptron.thetas_roll(optimized_theta,layers),layers)
            cost_history.append(cost)
            theta_gradient = MultilayerPerceptron.gradient_step(data,labels,optimized_theta,layers)
            optimized_theta = optimized_theta - alpha * theta_gradient
        return optimized_theta,cost_history

        8、预测函数

        输入测试数据,前向传播走一次,得到预测值

    def predict(self,data):
        data_processed = prepare_for_training(data,normalize_data = self.normalize_data)[0]
        num_examples = data_processed.shape[0]
        predictions = MultilayerPerceptron.feedforword_propagation(data_processed,self.thetas,self.layers)

        return np.argmax(predictions,axis=1).reshape((num_examples,1))

四、完整代码

import  numpy as np
from Neural_Network_Lab.utils.features import prepare_for_training
from Neural_Network_Lab.utils.hypothesis import sigmoid,sigmoid_gradient

class MultilayerPerceptron:
    def __init__(self,data,labels,layers,normalize_data=False):
        data_processed = prepare_for_training(data,normalize_data=normalize_data)[0]
        self.data = data_processed
        self.labels = labels
        self.layers = layers #  [  784 ,25 ,10]
        self.normalize_data = normalize_data
        self.thetas = MultilayerPerceptron.thetas_init(layers)

    def predict(self,data):
        data_processed = prepare_for_training(data,normalize_data = self.normalize_data)[0]
        num_examples = data_processed.shape[0]
        predictions = MultilayerPerceptron.feedforword_propagation(data_processed,self.thetas,self.layers)

        return np.argmax(predictions,axis=1).reshape((num_examples,1))


    def train(self,max_ietrations = 1000,alpha = 0.1):
        #方便矩阵更新 拉长  把矩阵拉成向量
        unrolled_theta = MultilayerPerceptron.thetas_unroll(self.thetas)
        (optimized_theta, cost_history) = MultilayerPerceptron.gradient_descent(self.data,self.labels,unrolled_theta,self.layers,max_ietrations,alpha)
        self.thetas = MultilayerPerceptron.thetas_roll(optimized_theta,self.layers)

        return self.thetas,cost_history

    @staticmethod
    def gradient_descent(data,labels,unrolled_theta,layers,max_ietrations,alpha):
        #1. 计算损失值
        #2. 计算梯度值
        #3. 更新参数
        optimized_theta = unrolled_theta #最好的theta值
        cost_history = []  #损失值的记录
        for i in range(max_ietrations):
            if i % 10 == 0 :
                print("当前迭代次数:",i)
            cost  = MultilayerPerceptron.cost_function(data,labels,MultilayerPerceptron.thetas_roll(optimized_theta,layers),layers)
            cost_history.append(cost)
            theta_gradient = MultilayerPerceptron.gradient_step(data,labels,optimized_theta,layers)
            optimized_theta = optimized_theta - alpha * theta_gradient
        return optimized_theta,cost_history

    @staticmethod
    def gradient_step(data,labels,optimized_theta,layers):
        theta = MultilayerPerceptron.thetas_roll(optimized_theta,layers)
        #反向传播BP
        thetas_rolled_gradinets = MultilayerPerceptron.back_propagation(data,labels,theta,layers)
        thetas_unrolled_gradinets = MultilayerPerceptron.thetas_unroll(thetas_rolled_gradinets)
        return thetas_unrolled_gradinets

    @staticmethod
    def back_propagation(data,labels,thetas,layers):
        num_layers = len(layers)
        (num_examples,num_features) = data.shape
        num_label_types = layers[-1]

        deltas = {} # 算出每一层对结果的影响
        #初始化
        for layer_index in  range(num_layers - 1):
            in_count = layers[layer_index]
            out_count = layers[layer_index + 1]
            deltas[layer_index] = np.zeros((out_count,in_count+1)) #25 * 785 10 *26

        for example_index in range(num_examples):
            layers_inputs = {}
            layers_activations = {}
            layers_activation = data[example_index,:].reshape((num_features,1))
            layers_activations[0] = layers_activation

            #逐层计算
            for layer_index in range(num_layers - 1):
                layer_theta = thetas[layer_index]  #得到当前的权重参数值 : 25 *785 10 *26
                layer_input = np.dot(layer_theta,layers_activation) # 第一次 得到 25 * 1 第二次: 10 * 1
                layers_activation = np.vstack((np.array([[1]]),sigmoid(layer_input))) #完成激活函数,加上一个偏置参数
                layers_inputs[layer_index+1] = layer_input # 后一层计算结果
                layers_activations[layer_index +1] = layers_activation # 后一层完成激活的结果
            output_layer_activation = layers_activation[1:,:]
            #计算输出层和结果的差异
            delta = {}
            #标签处理
            bitwise_label = np.zeros((num_label_types,1))
            bitwise_label[labels[example_index][0]] = 1
            #计算输出结果和真实值之间的差异
            delta[num_layers-1] = output_layer_activation - bitwise_label #输出层

            #遍历 L,L-1,L-2...2
            for layer_index in range(num_layers - 2,0,-1):
                layer_theta = thetas[layer_index]
                next_delta = delta[layer_index+1]
                layer_input = layers_inputs[layer_index]
                layer_input = np.vstack((np.array((1)),layer_input))
                #按照公式计算
                delta[layer_index] = np.dot(layer_theta.T,next_delta)*sigmoid(layer_input)
                #过滤掉偏置参数
                delta[layer_index] = delta[layer_index][1:,:]

            #计算梯度值
            for layer_index in  range(num_layers-1):
                layer_delta = np.dot(delta[layer_index+1],layers_activations[layer_index].T)  #微调矩阵
                deltas[layer_index] = deltas[layer_index] + layer_delta #第一次25 * 785 第二次 10 * 26

        for layer_index in range(num_layers-1):
            deltas[layer_index] = deltas[layer_index] * (1/num_examples)

        return deltas

    @staticmethod
    def cost_function(data,labels,thetas,layers):
        num_layers = len(layers)
        num_examples = data.shape[0]
        num_labels = layers[-1]
        #前向传播走一次
        predictions = MultilayerPerceptron.feedforword_propagation(data,thetas,layers)
        #制作标签,每一个样本的标签都是one-dot
        bitwise_labels = np.zeros((num_examples,num_labels))
        for example_index in range(num_examples):
            bitwise_labels[example_index][labels[example_index][0]] = 1
        #咱们的预测值是概率值y= 7 [0,0,0,0,0,0,1,0,0,0]    在正确值的位置上概率越大越好 在错误值的位置上概率越小越好
        bit_set_cost = np.sum(np.log(predictions[bitwise_labels == 1]))
        bit_not_set_cost = np.sum(np.log(1 - predictions[bitwise_labels == 0]))
        cost = (-1/num_examples) * (bit_set_cost+bit_not_set_cost)
        return cost

    @staticmethod
    def feedforword_propagation(data,thetas,layers):
        num_layers = len(layers)
        num_examples = data.shape[0]
        in_layer_activation = data #输入层

        #逐层计算 隐藏层
        for layer_index in range(num_layers - 1):
            theta = thetas[layer_index]
            out_layer_activation = sigmoid(np.dot(in_layer_activation,theta.T)) #输出层
            # 正常计算之后是num_examples * 25 ,但是要考虑偏置项 变成num_examples * 26
            out_layer_activation = np.hstack((np.ones((num_examples,1)),out_layer_activation))
            in_layer_activation = out_layer_activation

        #返回输出层结果,不要偏置项
        return in_layer_activation[:,1:]

    @staticmethod
    def thetas_roll(unrolled_theta,layers):
        num_layers = len(layers)
        thetas = {}
        unrolled_shift = 0
        for layer_index in range(num_layers - 1):
            in_count = layers[layer_index]
            out_count = layers[layer_index + 1]

            thetas_width = in_count + 1
            thetas_height = out_count
            thetas_volume = thetas_width * thetas_height
            start_index = unrolled_shift
            end_index =unrolled_shift + thetas_volume
            layer_theta_unrolled = unrolled_theta[start_index:end_index]
            thetas[layer_index] = layer_theta_unrolled.reshape((thetas_height,thetas_width))
            unrolled_shift = unrolled_shift + thetas_volume

        return thetas

    @staticmethod
    def thetas_unroll(thetas):
        #拼接成一个向量
        num_theta_layers = len(thetas)
        unrolled_theta = np.array([])
        for theta_layer_index in range(num_theta_layers):
            unrolled_theta = np.hstack((unrolled_theta,thetas[theta_layer_index].flatten()))
        return unrolled_theta

    @staticmethod
    def thetas_init(layers):
        num_layers = len(layers)
        thetas = {} #用字典形式 key:表示第几层 vlues:权重参数矩阵
        for layer_index in range(num_layers-1):
            '''
            会执行两次: 得到两组参数矩阵 25 * 785 , 10 * 26
            '''
            in_count = layers[layer_index]
            out_count = layers[layer_index+1]
            #初始化 初始值小
            #这里需要考虑偏置项,偏置的个数与输出的个数一样
            thetas[layer_index]=np.random.rand(out_count,in_count+1) * 0.05 #加一列输入特征
        return thetas

 五、手写数字识别

        数据集(读者可以找找下载,我就不放链接了>_<):   

 

         共一万个样本,第一列为标签值,一列表示像素点的值共28*28共784个像素点。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mping
import math
from Neural_Network_Lab.Multilayer_Perceptron import MultilayerPerceptron

data = pd.read_csv('../Neural_Network_Lab/data/mnist-demo.csv')
#展示数据
numbers_to_display = 25
num_cells = math.ceil(math.sqrt(numbers_to_display))
plt.figure(figsize=(10,10))
for plot_index in range(numbers_to_display):
    digit = data[plot_index:plot_index+1].values
    digit_label = digit[0][0]
    digit_pixels = digit[0][1:]
    image_size = int(math.sqrt(digit_pixels.shape[0]))
    frame = digit_pixels.reshape((image_size,image_size))
    plt.subplot(num_cells,num_cells,plot_index+1)
    plt.imshow(frame,cmap = 'Greys')
    plt.title(digit_label)
plt.subplots_adjust(wspace=0.5,hspace=0.5)
plt.show()

train_data = data.sample(frac= 0.8)
test_data = data.drop(train_data.index)

train_data = train_data.values
test_data = test_data.values

num_training_examples = 8000

X_train = train_data[:num_training_examples,1:]
y_train = train_data[:num_training_examples,[0]]

X_test = test_data[:,1:]
y_test = test_data[:,[0]]

layers = [784,25,10]
normalize_data = True
max_iteration = 500
alpha = 0.1

multilayerperceptron = MultilayerPerceptron(X_train,y_train,layers,normalize_data)
(thetas,cost_history) = multilayerperceptron.train(max_iteration,alpha)
plt.plot(range(len(cost_history)),cost_history)
plt.xlabel('Grident steps')
plt.ylabel('cost')
plt.show()

y_train_predictions = multilayerperceptron.predict(X_train)
y_test_predictions = multilayerperceptron.predict(X_test)

train_p = np.sum((y_train_predictions == y_train) / y_train.shape[0] * 100)
test_p = np.sum((y_test_predictions == y_test) / y_test.shape[0] * 100)

print("训练集准确率:",train_p)
print("测试集准确率:",test_p)

numbers_to_display = 64
num_cells = math.ceil(math.sqrt(numbers_to_display))
plt.figure(figsize=(15,15))
for plot_index in range(numbers_to_display):
    digit_label = y_test[plot_index,0]
    digit_pixels = X_test[plot_index,:]

    predicted_label = y_test_predictions[plot_index][0]

    image_size = int(math.sqrt(digit_pixels.shape[0]))
    frame = digit_pixels.reshape((image_size,image_size))
    plt.subplot(num_cells,num_cells,plot_index+1)
    color_map = 'Greens' if predicted_label == digit_label else 'Reds'
    plt.imshow(frame,cmap = color_map)
    plt.title(predicted_label)
    plt.tick_params(axis='both',which='both',bottom=False,left=False,labelbottom=False)

plt.subplots_adjust(wspace=0.5,hspace=0.5)
plt.show()

         训练集8000个,测试集2000个,迭代次数500次

        

        

         这里准确率不高,读者可以自行调整参数,改变迭代次数,网络层次都可以哦。

          

        

         

        

        

       

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1547116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言神经网路模型应用(1)

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。要求&#xff1a;target和target2为因变量&#xff0c;其他诸变量为自变量&#xff0c;用神经网络模型&#xff08;多层感知…

PC电脑技巧[笔记本通过网线访问设备CMW500]

笔记本局域网访问设备 现在我有一台CMW500,我要用笔记本去访问它,但是我发现没有路由器就是不能够访问,通过网线连接设备就是ping不通: 这里设置TCP/IPv4的IP地址如下,这时候就可以pin通了:

跟张良均老师学大数据人工智能——数据挖掘集训营开营

集训营特色&#xff1a; 知识点深入浅出&#xff0c;实现以学促用 以业务内容为主线&#xff0c;数据挖掘技能嵌入 多行业项目实战&#xff0c;全面提升职业素养 全程线上辅导&#xff0c;助力熟练掌握技能 惊喜优惠&#xff1a; 限时“六折”&#xff01; 师傅带练 方向…

VsCode中安装codeium 显示failed to start language server

一、在VsCode的SSH Remote插件中安装Codeium 失败&#xff1a; 1、在插件Remote Explore中的SSH安装Codeium插件后提示无法下载语言服务器&#xff0c;如下图所示 2、去Codeium的仓库中找到对应版本的语言服务器包下载&#xff0c;然后解压并拷贝到远程服务器Ubuntu中的如下目…

云手机:实现便携与安全的双赢

随着5G时代的到来&#xff0c;云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本&#xff0c;提高了效率&#xff0c;而且在边缘计算和云技术逐渐成熟的背景下&#xff0c;展现出了更大的发展机遇。 云手机的便携性如何&#xff1f; 云手机的便携性…

【jenkins+cmake+svn管理c++项目】创建一个项目

工作台点击"新建item",进入下图&#xff0c;选择Freestyle project,并输入项目名称&#xff0c; 点击确定之后进入项目配置页面&#xff0c;填写描述&#xff0c;然后在下边源码管理部分选择svn, 填写代码的url 上图的Credentials处填写svn的有效登录名和密码&#x…

5.1 物联网RK3399项目开发实录-Android开发之ADB使用(wulianjishu666)

物联网项目开发实例&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11VQMhHfIL9mZhNlls4wmjw?pwd0gfa 1. ADB 使用 1.1. 前言 ADB&#xff0c;全称 Android Debug Bridge&#xff0c;是 Android 的命令行调试工具&#xff0c;可以完成多种功能&#xff0c;如跟踪系…

DP:简单多状态模型

创作不易&#xff0c;感谢三连 多状态DP表示第i天的时候可能的状态不同&#xff0c;所以我们要去区分不同的状态。 一、打家劫舍&#xff08;1&#xff09; . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int rob(vector<int>& nums) {int n…

C++初步认识

一.开发环境 Dev-C是一个Windows环境下的一个适合于初学者使用的轻量级C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。 Dev-C 使用MingW64/TDM-GCC编译器&#xff0c;遵循C 11标准&#xff0c;同时兼容C98标…

jmeter二次开发发送java请求_保姆级教程!!!

一、引言 JMeter是Apache基金会开发的一款开源性能测试工具&#xff0c;广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试&#xff0c;以评估应用程序的性能和稳定性。然而&#xff0c;在实际使用过程中&#xff0c;用户可能会遇到需要发送Java请…

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

Python 全栈体系【四阶】(二十一)

第五章 深度学习 二、推荐系统 2. 协同过滤及实现 2.1 基于物品的协同过滤推荐技术(评分) 2.2 基于物品的协同过滤算法(Item_CF) 2.3 基于用户的协同过滤算法&#xff08;user-based collaboratIve filtering&#xff09; 2.4 基本原理 2.5 ICF 计算物品之间的相似度&#…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

求两个单链表的差集

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 但行前路&#xff0c;不负韶华&#…

搭建Hadoop HA

目录 前言 搭建前准备 搭建 前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它允许用户在不了解分布式底层细节的情况下开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。Hadoop主要解决大数据存储和大数据分析两大核心问题&…

机器学习(二)

线性模型: 离散转为连续的变换: 检查是否有“序”的变化&#xff0c;若有“序”&#xff0c;则连续化&#xff1b;否则&#xff0c;转化为k维向量 最小二乘解: 多元线性回归: 广义线性模型: 线性判别分析: 由于将样例投影到一条直线(低维空间)&#xff0c;因此也被视为一种&q…

excel统计分析——协方差分析基本原理

参考资料&#xff1a;生物统计学 方差分析中&#xff0c;要求除试验因素外的其他条件保持在相同水平上才能对实验结果的差异显著性进行比较&#xff0c;然而有些非试验因素很难或不可能人为控制&#xff0c;此时如果使用方差分析法推断处理其差异显著性&#xff0c;往往会导致错…

深度学习-数据归一化与Batch Normalization

文章目录 数据归一化与Batch Normalization一、经典机器学习的归一化算法1.经典机器学习归一化方法回顾1.1 0-1标准化方法1.2 Z-Score标准化 2.经典机器学习归一化算法在深度学习中的实践3.Z-Score数据归一化的局限3.1 Zero-Centered特性消失3.2 Zero-Centered Data的作用局限 …

【AI】使用Azure OpenAI创建自己的AI应用!

【AI】使用Azure OpenAI创建自己的AI应用! 目录 【AI】使用Azure OpenAI创建自己的AI应用!创建工作区模型介绍部署模型API参数计算Token使用Python SDK调用补全模型调用对话模型流式调用异步调用提示技巧生成对话分类推荐超级课程: Docker快速入门到精通Kubernetes入门到大师…

Golang-MAP源码学习、扩容机制等

前言 map是golang中常用的一个基本数据结构&#xff0c;继上篇的channel源码学习之后&#xff0c;本文学习map的源码相关。 基础知识点 此部分参考自 https://www.zhihu.com/tardis/zm/art/423008350?source_id1003 map的用法 通过make初始化分配容量&#xff0c;通过m[k…