神经网络代码实现

news2025/1/21 2:51:22

目录

神经网络整体框架

核心计算步骤

参数初始化

 矩阵拉伸与还原

前向传播

损失函数定义

反向传播

全部迭代更新完成

数字识别实战

神经网络整体框架

核心计算步骤

参数初始化

# 定义初始化函数   normalize_data是否需要标准化
    def __init__(self,data,labels,layers,normalize_data=False):
        # 数据处理
        data_procesed = prepare_for_training(data,normalize_data = normalize_data)
        # 获取当前处理好的数据
        self.data = data_procesed
        self.labels = labels
        # 定义神经网络层数
        self.layers = layers #784(28*28*1)| 像素点 25(隐层神经元)| 10(十分类任务)
        self.normalize_data = normalize_data
        # 初始化权重参数
        self.thetas = MultilayerPerceptron.thetas_init(layers)

    @staticmethod
    def thetas_init(layers):
        # 层的个数
        num_layers = len(layers)
        # 构建多组权重参数
        thetas = {}
        # 会执行两次,得到两组参数矩阵:25*785 , 10*26
        for layer_index in range(num_layers - 1):
            # 输入
            in_count = layers[layer_index] #784
            # 输出
            out_count = layers[layer_index+1]
            # 构建矩阵并初始化操作 随机进行初始化操作,值尽量小一点
            thetas[layer_index] = np.random.rand(out_count,in_count+1)*0.05 # WX in_count+1:偏置项考虑进去,偏置项个数跟输出的结果一致
            return thetas

 矩阵拉伸与还原

 
# 将25*785矩阵拉长1*19625
    @staticmethod
    def thetas_unroll(thetas):
        num_theta_layers = len(thetas) #25*785 , 10*26;num_theta_layers长度为2
        unrolled_theta = np.array([])
        for theta_layer_index in range(num_theta_layers):
            # thetas[theta_layer_index].flatten()矩阵拉长
            # np.hstack((unrolled_theta, thetas[theta_layer_index].flatten())) 数组拼接 将25*785 , 10*26两个矩阵拼接成一个 1*x的矩阵
            unrolled_theta = np.hstack((unrolled_theta, thetas[theta_layer_index].flatten()))
        return unrolled_theta
# 矩阵还原
    """
    将展开的`unrolled_thetas`重新组织成一个字典`thetas`,其中每个键值对表示一个层的权重阵。
    函数的输入参数包括展开的参数`unrolled_thetas`和神经网络的层结构`layers`。
    具体来说,函数首先获取层的数量`num_layers`,然后创建一个空字典`thetas`用于存储权重矩阵。
    接下来,函数通过循环遍历每一层(除了最后一层),并根据层的输入和输出节点数计算权重矩阵的大小。
    在循环中,函数首先计算当前层权重矩阵的宽度`thetas_width`和高度`thetas_height`,
    然后计算权重矩阵的总元素个数`thetas_volume`。
    接着,函数根据展开参数的索引范围提取对应层的展开权重,并通过`reshape`函数将展开权重重新组织成一个二维矩阵。
    最后,函数将该矩阵存储到字典`thetas`中,键为当前层的索引。
    循环结束后,函数返回字典`thetas`,其中包含了每一层的权重矩阵。
    """
    @staticmethod
    def thetas_roll(unrolled_thetas,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_thetas[start_index:end_index]
            # 获得25*785和10*26两个矩阵
            thetas[layer_index] = layer_theta_unrolled.reshape((thetas_height, thetas_width))
            # 更新
            unrolled_shift = unrolled_shift + thetas_volume
        return thetas

前向传播

# 前向传播函数
    @staticmethod
    def feedforward_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.feedforward_propagation(data, thetas, layers)
        # 制作标签,每一个样本的标签都得是one-hot
        bitwise_labels = np.zeros((num_examples, num_labels))
        for example_index in range(num_examples):
            # 将对应的位置改为 1
            bitwise_labels[example_index][labels[example_index][0]] = 1
        # 计算损失
        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 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 = {}
            # 第0层输入转换为向量个数 输入层结果
            layers_activation = data[example_index, :].reshape((num_features, 1))  # 785*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_gradient(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

全部迭代更新完成

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

class MultilayerPerceptron:
    # 定义初始化函数   normalize_data是否需要标准化
    def __init__(self,data,labels,layers,normalize_data=False):
        # 数据处理
        data_procesed = prepare_for_training(data,normalize_data = normalize_data)
        # 获取当前处理好的数据
        self.data = data_procesed
        self.labels = labels
        # 定义神经网络层数
        self.layers = layers #784(28*28*1)| 像素点 25(隐层神经元)| 10(十分类任务)
        self.normalize_data = normalize_data
        # 初始化权重参数
        self.thetas = MultilayerPerceptron.thetas_init(layers)

    @staticmethod
    def thetas_init(layers):
        # 层的个数
        num_layers = len(layers)
        # 构建多组权重参数
        thetas = {}
        # 会执行两次,得到两组参数矩阵:25*785 , 10*26
        for layer_index in range(num_layers - 1):
            # 输入
            in_count = layers[layer_index] #784
            # 输出
            out_count = layers[layer_index+1]
            # 构建矩阵并初始化操作 随机进行初始化操作,值尽量小一点
            thetas[layer_index] = np.random.rand(out_count,in_count+1)*0.05 # WX in_count+1:偏置项考虑进去,偏置项个数跟输出的结果一致
            return thetas

    # 将25*785矩阵拉长1*19625
    @staticmethod
    def thetas_unroll(thetas):
        num_theta_layers = len(thetas) #25*785 , 10*26;num_theta_layers长度为2
        unrolled_theta = np.array([])
        for theta_layer_index in range(num_theta_layers):
            # thetas[theta_layer_index].flatten()矩阵拉长
            # np.hstack((unrolled_theta, thetas[theta_layer_index].flatten())) 数组拼接 将25*785 , 10*26两个矩阵拼接成一个 1*x的矩阵
            unrolled_theta = np.hstack((unrolled_theta, thetas[theta_layer_index].flatten()))
        return unrolled_theta

    # 矩阵还原
    """
    将展开的`unrolled_thetas`重新组织成一个字典`thetas`,其中每个键值对表示一个层的权重阵。
    函数的输入参数包括展开的参数`unrolled_thetas`和神经网络的层结构`layers`。
    具体来说,函数首先获取层的数量`num_layers`,然后创建一个空字典`thetas`用于存储权重矩阵。
    接下来,函数通过循环遍历每一层(除了最后一层),并根据层的输入和输出节点数计算权重矩阵的大小。
    在循环中,函数首先计算当前层权重矩阵的宽度`thetas_width`和高度`thetas_height`,
    然后计算权重矩阵的总元素个数`thetas_volume`。
    接着,函数根据展开参数的索引范围提取对应层的展开权重,并通过`reshape`函数将展开权重重新组织成一个二维矩阵。
    最后,函数将该矩阵存储到字典`thetas`中,键为当前层的索引。
    循环结束后,函数返回字典`thetas`,其中包含了每一层的权重矩阵。
    """
    @staticmethod
    def thetas_roll(unrolled_thetas,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_thetas[start_index:end_index]
            # 获得25*785和10*26两个矩阵
            thetas[layer_index] = layer_theta_unrolled.reshape((thetas_height, thetas_width))
            # 更新
            unrolled_shift = unrolled_shift + thetas_volume
        return thetas

    # 损失函数定义
    @staticmethod
    def cost_function(data,labels,thetas,layers):
        # 获取层数
        num_layers = len(layers)
        # 样本个数
        num_examples = data.shape[0]
        # 分类个数
        num_labels = layers[-1]
        # 前向传播走一次
        predictions = MultilayerPerceptron.feedforward_propagation(data, thetas, layers)
        # 制作标签,每一个样本的标签都得是one-hot
        bitwise_labels = np.zeros((num_examples, num_labels))
        for example_index in range(num_examples):
            # 将对应的位置改为 1
            bitwise_labels[example_index][labels[example_index][0]] = 1
        # 计算损失
        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 gradient_step(data, labels, optimized_theta, layers):
        # 将theta值还原成矩阵格式
        theta = MultilayerPerceptron.thetas_roll(optimized_theta, layers)
        # 反向传播
        thetas_rolled_gradients = MultilayerPerceptron.back_propagation(data, labels, theta, layers)
        # 将矩阵拉伸方便参数更新
        thetas_unrolled_gradients = MultilayerPerceptron.thetas_unroll(thetas_rolled_gradients)
        # 返回梯度值
        return thetas_unrolled_gradients

    # 梯度下降模块
    @staticmethod
    def gradient_descent(data,labels,unrolled_theta,layers,max_iterations,alpha):
        # 最终得到的theta值先使用初始theta
        optimized_theta = unrolled_theta
        # 每次迭代都会得到当前的损失值,记录到 cost_history数组中
        cost_history = []
        # 进行迭代
        for _ in range(max_iterations):
            # 1.计算当前损失值  thetas_roll()函数将拉长后的向量还原成矩阵
            cost = MultilayerPerceptron.cost_function(data, labels,
                                                      MultilayerPerceptron.thetas_roll(optimized_theta, layers), layers)
            # 记录当前损失
            cost_history.append(cost)
            # 2.根据损失值计算当前梯度值
            theta_gradient = MultilayerPerceptron.gradient_step(data, labels, optimized_theta, layers)
            # 3.更新梯度值,最终得到的结果是优化完的theta
            optimized_theta = optimized_theta - alpha * theta_gradient
        return optimized_theta, cost_history

    # 前向传播函数
    @staticmethod
    def feedforward_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 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 = {}
            # 第0层输入转换为向量个数 输入层结果
            layers_activation = data[example_index, :].reshape((num_features, 1))  # 785*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_gradient(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


    # 定义训练模块      定义最大迭代次数    定义学习率
    def train(self,max_iterations=1000,alpha=0.1):
        """第一步首先需要做优化,计算损失函数然后根据损失函数计算梯度值,
        然后更新梯度值调整权重参数,前向传播加反向传播,整体一次迭代"""
        # 将矩阵转化为向量方便参数更新,将25*785矩阵拉长1*19625
        unrolled_theta = MultilayerPerceptron.thetas_unroll(self.thetas)
        # 梯度下降模块
        (optimized_theta, cost_history) = MultilayerPerceptron.gradient_descent(self.data, self.labels, unrolled_theta,
                                                                                self.layers, max_iterations, alpha)
        # 参数更新完成之后需要将拉长后的还原,进行前向传播
        self.thetas = MultilayerPerceptron.thetas_roll(optimized_theta, self.layers)
        return self.thetas, cost_history

数字识别实战

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mping 
import math

from multilayer_perceptron import MultilayerPerceptron


data = pd.read_csv('../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 = 1700

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_iterations = 300
alpha = 0.1


multilayer_perceptron = MultilayerPerceptron(x_train,y_train,layers,normalize_data)
(thetas,costs) = multilayer_perceptron.train(max_iterations,alpha)
plt.plot(range(len(costs)),costs)
plt.xlabel('Grident steps')
plt.xlabel('costs')
plt.show()


y_train_predictions = multilayer_perceptron.predict(x_train)
y_test_predictions = multilayer_perceptron.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))

    color_map = 'Greens' if predicted_label == digit_label else 'Reds'
    plt.subplot(num_cells, num_cells, plot_index + 1)
    plt.imshow(frame, cmap=color_map)
    plt.title(predicted_label)
    plt.tick_params(axis='both', which='both', bottom=False, left=False, labelbottom=False, labelleft=False)

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

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

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

相关文章

遨博I20协作臂关节逆解组Matlab可视化

AUBO I20协作臂关节逆解组Matlab可视化 前言1、RTB使用注意点2、代码与效果2.1、完整代码2.2、运行效果 总结 前言 注意:请预先配置好Matlab和RTB机器人工具箱环境,本文使用matlab2022b和RTB10.04版本 工作需要,使用matlab实现对六轴机械臂…

【Kubernetes in Action笔记】1.快速开始

在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …

Jetpack Compose 第 2 课:布局

点击查看:Jetpack Compose 教程 点击查看:Composetutorial 代码 简介 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。 在本教程中&a…

Centos7挂载磁盘

1 查看未挂载的磁盘 命令: fdisk -l红框圈中的即是本次要挂载的磁盘,/dev/vdb 与 /dev/vda 相比,其没有下方的 /dev/vda1 等信息,代表 /dev/vdb 磁盘并没有进行过分区操作,是一个新加的硬盘。 2 对新建的磁盘进行分…

2024.2.18

使用fgets统计给定文件的行数 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test.txt","w"))NULL){perror("open err");return -1;}fputc(h,fp);fputc(\n,fp);fput…

【Webpack】处理字体图标和音视频资源

处理字体图标资源 1. 下载字体图标文件 打开阿里巴巴矢量图标库open in new window选择想要的图标添加到购物车&#xff0c;统一下载到本地 2. 添加字体图标资源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字体…

【MySQL进阶之路】MySQL中的聚簇索引和非聚簇索引、以及回表查询

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

uniapp返回上一级页面,传参,上一级通过参数重新请求数据

小程序navigateback传值_微信小程序 wx.navigateBack() 返回页面如何传递参数 - 文章...-CSDN博客 当前页面 上一级页面

【Kuiperinfer】笔记01 项目预览与环境配置

学习目标 实现一个深度学习推理框架设计、编写一个计算图实现常见的算子&#xff0c;例如卷积、池化、全连接学会如何进行算子的优化加速使用自己的推理框架推理常见模型&#xff0c;检查结果是否能够和torch对齐 什么是推理框架&#xff1f; 推理框架用于对已经训练完成的模…

php数组运算符 比较 isset、is_null、empty的用法和区别

php数组运算符 1. 数组运算符2. 判断两个数组是否相等3. isset、is_null、empty的用法和区别 1. 数组运算符 注意&#xff1a;只会保留第一个数组中的键值对&#xff0c;而忽略后面数组中相同键名的元素&#xff0c;如果想要合并两个数组并覆盖相同键名的元素&#xff0c;可以…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源&#xff0c;投票及个人中心详细自行查看…

HTTP请求报文与响应报文格式

HTTP请求报文与响应报文格式 HTTP请求报文与响应报文格式 请求报文包含四部分&#xff1a; a、请求行&#xff1a;包含请求方法、URI、HTTP版本信息b、请求首部字段c、请求内容实体d、空行 响应报文包含四部分&#xff1a; a、状态行&#xff1a;包含HTTP版本、状态码、状态码…

程序员也需要休息:为什么有时候他们不喜欢关电脑

程序员为什么不喜欢关电脑&#xff1f; 背景&#xff1a;作为程序员&#xff0c;长时间与电脑为伴是家常便饭。然而&#xff0c;有时候他们也会觉得厌倦和疲惫&#xff0c;不喜欢过多地与电脑打交道。本文将探讨程序员为何需要适当的休息和放松&#xff0c;以及如何更好地管理…

代码随想录第33天|● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

文章目录 1005.K次取反后最大化的数组和贪心思路&#xff1a;代码&#xff1a; 34. 加油站思路一&#xff1a;全局贪心代码&#xff1a; 思路二&#xff1a;代码&#xff1a; 135. 分发糖果思路&#xff1a;两边考虑代码&#xff1a; 1005.K次取反后最大化的数组和 贪心思路&am…

[C++]二叉搜索树

一、定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

Java+Vue+MySQL,国产动漫网站全栈升级

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

综合练习

目录 查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、工资等级 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、部门名称、工资…

如何系统地学习Python

建议系统学习Python的途径遵循理论与实践相结合的教学方法。以下是一个分阶段的学习计划&#xff1a; 阶段一&#xff1a;基础知识 理解Python的特点&#xff1a; 认识Python的历史与设计哲学。学习Python的基本语法和运行环境。 安装Python&#xff1a; 学习如何在不同操作系…

NNLM - 神经网络语言模型 | 高效的单词预测工具

本系列将持续更新NLP相关模型与方法&#xff0c;欢迎关注&#xff01; 简介 神经网络语言模型&#xff08;NNLM&#xff09;是一种人工智能模型&#xff0c;用于学习预测词序列中下一个词的概率分布。它是自然语言处理&#xff08;NLP&#xff09;中的一个强大工具&#xff0c;…

从kafka如何保证数据一致性看通常数据一致性设计

一、前言 在数据库系统中有个概念叫事务&#xff0c;事务的作用是为了保证数据的一致性&#xff0c;意思是要么数据成功&#xff0c;要么数据失败&#xff0c;不存在数据操作了一半的情况&#xff0c;这就是数据的一致性。在很多系统或者组件中&#xff0c;很多场景都需要保证…