当前位置: 首页 > news >正文

C++.神经网络与深度学习(赶工版)(会二次修改)

神经网络与深度学习

  • 1. 神经网络基础
    • 1.1 神经元模型与激活函数
    • 1.2 神经网络结构与前向传播
    • 2.1 损失函数与优化算法
      • 均方误差损失函数
      • 交叉熵损失函数
      • 梯度下降优化算法
    • 2.2 反向传播与梯度计算
      • 神经元的反向传播
    • 3.1 神经元类设计与实现
      • 神经元类代码实现
      • 代码思路
    • 3.2 神经网络类构建
      • 神经网络类代码实现
      • 代码思路
    • 4.1 神经元模型与激活函数
    • 4.2 神经网络结构与前向传播
    • 4.3 深度学习框架中的关键组件
    • 4.4 反向传播与梯度计算
    • 4.5 神经网络类的构建与实现

1. 神经网络基础

1.1 神经元模型与激活函数

神经元是神经网络的基本单元,其模型可以类比为生物神经元。一个神经元接收多个输入信号,对这些信号进行加权求和,然后通过一个激活函数进行非线性变换,最终输出一个信号。以下是用 C++ 实现一个简单神经元的代码示例:

#include <iostream>
#include <vector>
#include <cmath>// 定义激活函数
double sigmoid(double x) {return 1.0 / (1.0 + exp(-x));
}// 神经元类
class Neuron {
private:std::vector<double> weights; // 权重double bias; // 偏置public:// 构造函数Neuron(int input_size) {weights.resize(input_size, 0.0); // 初始化权重为0bias = 0.0; // 初始化偏置为0}// 设置权重和偏置void set_weights(const std::vector<double>& w, double b) {weights = w;bias = b;}// 前向传播,计算输出double forward(const std::vector<double>& inputs) {double sum = bias;for (size_t i = 0; i < inputs.size(); ++i) {sum += inputs[i] * weights[i];}return sigmoid(sum); // 使用Sigmoid激活函数}
};int main() {// 创建一个输入大小为2的神经元Neuron neuron(2);// 设置权重和偏置std::vector<double> weights = {0.5, -0.3};double bias = 0.1;neuron.set_weights(weights, bias);// 输入信号std::vector<double> inputs = {1.0, -2.0};// 计算输出double output = neuron.forward(inputs);std::cout << "Neuron output: " << output << std::endl;return 0;
}

代码思路:

  • 激活函数:Sigmoid 函数是一个常用的激活函数,它将输入映射到 (0, 1) 区间,具有平滑的梯度,适用于神经元的非线性变换。
  • 神经元类
    • 成员变量weights 存储输入信号的权重,bias 是偏置项。
    • 构造函数:根据输入信号的数量初始化权重和偏置。
    • 设置权重和偏置:通过 set_weights 函数设置权重和偏置。
    • 前向传播forward 函数计算输入信号的加权和,加上偏置后通过激活函数输出结果。
  • 主函数
    • 创建一个神经元实例,设置权重和偏置。
    • 提供输入信号,调用 forward 函数计算输出。

1.2 神经网络结构与前向传播

神经网络由多个神经元组成,通常分为输入层、隐藏层和输出层。前向传播是指从输入层到输出层逐层计算的过程。以下是一个简单的两层神经网络的 C++ 实现:

#include <iostream>
#include <vector>
#include <cmath>// 激活函数
double sigmoid(double x) {return 1.0 / (1.0 + exp(-x));
}// 神经元类
class Neuron {
private:std::vector<double> weights;double bias;public:Neuron(int input_size) {weights.resize(input_size, 0.0);bias = 0.0;}void set_weights(const std::vector<double>& w, double b) {weights = w;bias = b;}double forward(const std::vector<double>& inputs) {double sum = bias;for (size_t i = 0; i < inputs.size(); ++i) {sum += inputs[i] * weights[i];}return sigmoid(sum);}
};// 神经网络类
class NeuralNetwork {
private:std::vector<Neuron> hidden_layer; // 隐藏层Neuron output_neuron; // 输出层public:NeuralNetwork(int input_size, int hidden_size) {hidden_layer.resize(hidden_size, Neuron(input_size));output_neuron = Neuron(hidden_size);}void set_weights(const std::vector<std::vector<double>>& hidden_weights,const std::vector<double>& hidden_biases,const std::vector<double>& output_weights,double output_bias) {for (size_t i = 0; i < hidden_layer.size(); ++i) {hidden_layer[i].set_weights(hidden_weights[i], hidden_biases[i]);}output_neuron.set_weights(output_weights, output_bias);}double forward(const std::vector<double>& inputs) {std::vector<double> hidden_outputs(hidden_layer.size());for (size_t i = 0; i < hidden_layer.size(); ++i) {hidden_outputs[i] = hidden_layer[i].forward(inputs);}return output_neuron.forward(hidden_outputs);}
};int main() {// 创建一个输入大小为2,隐藏层大小为2的神经网络NeuralNetwork nn(2, 2);// 设置权重和偏置std::vector<std::vector<double>> hidden_weights = {{0.5, -0.3}, {0.2, 0.1}};std::vector<double> hidden_biases = {0.1, -0.2};std::vector<double> output_weights = {0.4, -0.5};double output_bias = 0.3;nn.set_weights(hidden_weights, hidden_biases, output_weights, output_bias);// 输入信号std::vector<double> inputs = {1.0, -2.0};// 计算输出double output = nn.forward(inputs);std::cout << "Neural Network output: " << output << std::endl;return 0;
}

代码思路:

  • 神经网络类
    • 成员变量hidden_layer 存储隐藏层的神经元,output_neuron 是输出层的神经元。
    • 构造函数:根据输入层大小和隐藏层大小初始化神经网络。
    • 设置权重和偏置:通过 set_weights 函数设置隐藏层和输出层的权重和偏置。
    • 前向传播
      • 隐藏层的每个神经元对输入信号进行前向传播,计算隐藏层的输出。
      • 将隐藏层的输出作为输出层神经元的输入,计算最终输出。
  • 主函数
    • 创建一个神经网络实例,设置权重和偏置。
    • 提供输入信号,调用 forward 函数计算输出。# 2. 深度学习框架

2.1 损失函数与优化算法

在深度学习中,损失函数用于衡量模型的预测值与真实值之间的差异,优化算法则用于调整模型的参数以最小化损失函数。以下是几种常见的损失函数和优化算法的实现及讲解。

均方误差损失函数

均方误差(MSE)损失函数是回归任务中常用的损失函数,它计算预测值与真实值之间差的平方的均值。

#include <iostream>
#include <vector>
#include <cmath>// 均方误差损失函数
double mse_loss(const std::vector<double>& predictions, const std::vector<double>& targets) {double loss = 0.0;for (size_t i = 0; i < predictions.size(); ++i) {loss += std::pow(predictions[i] - targets[i], 2);}return loss / predictions.size();
}int main() {// 示例:预测值和真实值std::vector<double> predictions = {0.5, 1.2, -0.3};std::vector<double> targets = {0.4, 1.0, -0.5};// 计算损失double loss = mse_loss(predictions, targets);std::cout << "MSE Loss: " << loss << std::endl;return 0;
}

代码思路:

  • 损失计算:遍历预测值和真实值,计算每个样本的预测值与真实值之差的平方。将所有样本的损失值求和后除以样本总数,得到均方误差损失。

交叉熵损失函数

交叉熵损失函数常用于分类任务,它衡量模型输出的概率分布与真实标签的概率分布之间的差异。

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>// Softmax函数
std::vector<double> softmax(const std::vector<double>& logits) {double max_logit = *std::max_element(logits.begin(), logits.end());double sum = 0.0;std::vector<double> probabilities(logits.size());for (size_t i = 0; i < logits.size(); ++i) {probabilities[i] = std::exp(logits[i] - max_logit);sum += probabilities[i];}for (size_t i = 0; i < logits.size(); ++i) {probabilities[i] /= sum;}return probabilities;
}// 交叉熵损失函数
double cross_entropy_loss(const std::vector<double>& logits, int target_class) {std::vector<double> probabilities = softmax(logits);return -std::log(probabilities[target_class]);
}int main() {// 示例:模型输出的logits和目标类别std::vector<double> logits = {2.0, 1.0, 0.1};int target_class = 0;// 计算损失double loss = cross_entropy_loss(logits, target_class);std::cout << "Cross-Entropy Loss: " << loss << std::endl;return 0;
}

代码思路:

  • Softmax函数
    • 对输入的logits进行归一化处理,使其转换为概率分布。
    • 首先计算每个logit的最大值,用于防止数值溢出。
    • 计算每个logit的指数值并归一化,得到概率分布。
  • 交叉熵损失
    • 使用Softmax函数计算模型输出的概率分布。
    • 计算目标类别的概率的负对数,得到交叉熵损失。

梯度下降优化算法

梯度下降是深度学习中最常用的优化算法之一,它通过计算损失函数对参数的梯度,更新参数以最小化损失。

#include <iostream>
#include <vector>
#include <cmath>// 梯度下降优化器
class GradientDescentOptimizer {
private:double learning_rate; // 学习率public:GradientDescentOptimizer(double lr) : learning_rate(lr) {}// 更新参数void update(std::vector<double>& params, const std::vector<double>& gradients) {for (size_t i = 0; i < params.size(); ++i) {params[i] -= learning_rate * gradients[i];}}
};int main() {// 示例:参数和梯度std::vector<double> params = {1.0, 2.0};std::vector<double> gradients = {0.5, -0.3};double learning_rate = 0.1;// 创建优化器GradientDescentOptimizer optimizer(learning_rate);// 更新参数optimizer.update(params, gradients);// 输出更新后的参数std::cout << "Updated parameters: ";for (double param : params) {std::cout << param << " ";}std::cout << std::endl;return 0;
}

代码思路:

  • 优化器类
    • 成员变量learning_rate 存储学习率。
    • 更新参数update 函数根据梯度和学习率更新参数。
  • 主函数
    • 初始化参数和梯度。
    • 创建优化器实例,调用 update 函数更新参数。

2.2 反向传播与梯度计算

反向传播是深度学习中用于计算损失函数对模型参数梯度的关键算法。它通过链式法则从输出层向输入层逐层计算梯度。

神经元的反向传播

以下是一个简单神经元的反向传播实现,包括前向传播和反向传播的代码。

#include <iostream>
#include <vector>
#include <cmath>// 激活函数及其导数
double sigmoid(double x) {return 1.0 / (1.0 + std::exp(-x));
}double sigmoid_derivative(double x) {return sigmoid(x) * (1.0 - sigmoid(x));
}// 神经元类
class Neuron {
private:std::vector<double> weights;double bias;public:Neuron(int input_size) {weights.resize(input_size, 0.0);bias = 0.0;}void set_weights(const std::vector<double>& w, double b) {weights = w;bias = b;}// 前向传播double forward(const std::vector<double>& inputs) {double sum = bias;for (size_t i = 0; i < inputs.size(); ++i) {sum += inputs[i] * weights[i];}return sigmoid(sum);}// 反向传播std::vector<double> backward(const std::vector<double>& inputs, double output, double target) {double error = target - output;double delta = error * sigmoid_derivative(output);std::vector<double> gradients(inputs.size());for (size_t i = 0; i < inputs.size(); ++i) {gradients[i] = delta * inputs[i];}return gradients;}
};int main() {// 创建一个输入大小为2的神经元Neuron neuron(2);// 设置权重和偏置std::vector<double> weights = {0.5, -0.3};double bias = 0.1;neuron.set_weights(weights, bias);// 输入信号和目标值std::vector<double> inputs = {1.0, -2.0};double target = 1.0;// 前向传播double output = neuron.forward(inputs);std::cout << "Neuron output: " << output << std::endl;// 反向传播std::vector<double> gradients = neuron.backward(inputs, output, target);// 输出梯度std::cout << "Gradients: ";for (double gradient : gradients) {std::cout << gradient << " ";}std::cout << std::endl;return 0;
}

代码思路:

  • 激活函数及其导数
    • sigmoid 函数用于前向传播,将输入映射到 (0, 1) 区间。
    • sigmoid_derivative 函数用于计算激活函数的导数,用于反向传播。
  • 神经元类
    • 前向传播:计算输入信号的加权和,加上偏置后通过激活函数输出结果。
    • 反向传播
      • 计算误差:error = target - output
      • 计算梯度:delta = error * sigmoid_derivative(output)
      • 计算每个输入对应的梯度:gradients[i] = delta * inputs[i]
  • 主函数
    • 创建神经元实例,设置权重和偏置。
    • 提供输入信号和目标值,调用 forward 函数计算输出。
    • 调用 backward 函数计算梯度。# 3. C++实现神经网络

3.1 神经元类设计与实现

神经元是神经网络的基本构建块,其设计需要考虑前向传播和反向传播两个过程。以下是基于C++标准库实现的神经元类,包含详细的代码和思路讲解。

神经元类代码实现

#include <iostream>
#include <vector>
#include <cmath>// 激活函数及其导数
double sigmoid(double x) {return 1.0 / (1.0 + std::exp(-x));
}double sigmoid_derivative(double x) {return sigmoid(x) * (1.0 - sigmoid(x));
}// 神经元类
class Neuron {
private:std::vector<double> weights; // 权重double bias; // 偏置public:// 构造函数:初始化权重和偏置Neuron(int input_size) {weights.resize(input_size, 0.0); // 初始化权重为0bias = 0.0; // 初始化偏置为0}// 设置权重和偏置void set_weights(const std::vector<double>& w, double b) {weights = w;bias = b;}// 前向传播:计算输出double forward(const std::vector<double>& inputs) {double sum = bias;for (size_t i = 0; i < inputs.size(); ++i) {sum += inputs[i] * weights[i];}return sigmoid(sum); // 使用Sigmoid激活函数}// 反向传播:计算梯度std::vector<double> backward(const std::vector<double>& inputs, double output, double target) {double error = target - output; // 计算误差double delta = error * sigmoid_derivative(output); // 计算梯度std::vector<double> gradients(inputs.size());for (size_t i = 0; i < inputs.size(); ++i) {gradients[i] = delta * inputs[i]; // 计算每个输入对应的梯度}return gradients;}
};

代码思路

  • 激活函数及其导数
    • sigmoid 函数用于前向传播,将输入映射到 (0, 1) 区间。
    • sigmoid_derivative 函数用于计算激活函数的导数,用于反向传播。
  • 神经元类
    • 成员变量
      • weights:存储输入信号的权重。
      • bias:存储偏置项。
    • 构造函数
      • 根据输入信号的数量初始化权重和偏置,权重初始化为0,偏置初始化为0。
    • 设置权重和偏置
      • 通过 set_weights 函数设置权重和偏置。
    • 前向传播
      • 计算输入信号的加权和,加上偏置后通过激活函数输出结果。
    • 反向传播
      • 计算误差:error = target - output
      • 计算梯度:delta = error * sigmoid_derivative(output)
      • 计算每个输入对应的梯度:gradients[i] = delta * inputs[i]

3.2 神经网络类构建

神经网络由多个神经元组成,通常分为输入层、隐藏层和输出层。以下是基于C++标准库实现的简单神经网络类,包含前向传播和反向传播的代码。

神经网络类代码实现

#include <iostream>
#include <vector>
#include <cmath>// 激活函数及其导数
double sigmoid(double x) {return 1.0 / (1.0 + std::exp(-x));
}double sigmoid_derivative(double x) {return sigmoid(x) * (1.0 - sigmoid(x));
}// 神经元类
class Neuron {
private:std::vector<double> weights;double bias;public:Neuron(int input_size) {weights.resize(input_size, 0.0);bias = 0.0;}void set_weights(const std::vector<double>& w, double b) {weights = w;bias = b;}double forward(const std::vector<double>& inputs) {double sum = bias;for (size_t i = 0; i < inputs.size(); ++i) {sum += inputs[i] * weights[i];}return sigmoid(sum);}std::vector<double> backward(const std::vector<double>& inputs, double output, double target) {double error = target - output;double delta = error * sigmoid_derivative(output);std::vector<double> gradients(inputs.size());for (size_t i = 0; i < inputs.size(); ++i) {gradients[i] = delta * inputs[i];}return gradients;}
};// 神经网络类
class NeuralNetwork {
private:std::vector<Neuron> hidden_layer; // 隐藏层Neuron output_neuron; // 输出层public:// 构造函数:初始化隐藏层和输出层NeuralNetwork(int input_size, int hidden_size) {hidden_layer.resize(hidden_size, Neuron(input_size));output_neuron = Neuron(hidden_size);}// 设置权重和偏置void set_weights(const std::vector<std::vector<double>>& hidden_weights,const std::vector<double>& hidden_biases,const std::vector<double>& output_weights,double output_bias) {for (size_t i = 0; i < hidden_layer.size(); ++i) {hidden_layer[i].set_weights(hidden_weights[i], hidden_biases[i]);}output_neuron.set_weights(output_weights, output_bias);}// 前向传播:计算输出double forward(const std::vector<double>& inputs) {std::vector<double> hidden_outputs(hidden_layer.size());for (size_t i = 0; i < hidden_layer.size(); ++i) {hidden_outputs[i] = hidden_layer[i].forward(inputs);}return output_neuron.forward(hidden_outputs);}// 反向传播:计算梯度std::vector<std::vector<double>> backward(const std::vector<double>& inputs, double output, double target) {std::vector<double> hidden_outputs(hidden_layer.size());for (size_t i = 0; i < hidden_layer.size(); ++i) {hidden_outputs[i] = hidden_layer[i].forward(inputs);}double output_error = target - output;double output_delta = output_error * sigmoid_derivative(output);std::vector<double> output_gradients(hidden_layer.size());for (size_t i = 0; i < hidden_layer.size(); ++i) {output_gradients[i] = output_delta * hidden_outputs[i];}std::vector<std::vector<double>> hidden_gradients(hidden_layer.size());for (size_t i = 0; i < hidden_layer.size(); ++i) {double hidden_error = output_delta * output_neuron.weights[i];double hidden_delta = hidden_error * sigmoid_derivative(hidden_outputs[i]);hidden_gradients[i].resize(inputs.size());for (size_t j = 0; j < inputs.size(); ++j) {hidden_gradients[i][j] = hidden_delta * inputs[j];}}return hidden_gradients;}
};

代码思路

  • 神经网络类
    • 成员变量
      • hidden_layer:存储隐藏层的神经元。
      • output_neuron:存储输出层的神经元。
    • 构造函数
      • 根据输入层大小和隐藏层大小初始化神经网络。
    • 设置权重和偏置
      • 通过 set_weights 函数设置隐藏层和输出层的权重和偏置。
    • 前向传播
      • 隐藏层的每个神经元对输入信号进行前向传播,计算隐藏层的输出。
      • 将隐藏层的输出作为输出层神经元的输入,计算最终输出。
    • 反向传播
      • 计算输出层的误差和梯度。
      • 通过链式法则计算隐藏层的误差和梯度。
      • 返回所有层的梯度,用于后续的参数更新。# 4. 总结

在本章中,我们详细探讨了神经网络的基础知识,包括神经元模型、激活函数、神经网络结构以及深度学习框架中的关键组件。通过这些内容,我们逐步构建了一个完整的神经网络模型,并实现了前向传播和反向传播算法。

4.1 神经元模型与激活函数

神经元是神经网络的基本单元,其设计灵感来源于生物神经元。一个神经元接收多个输入信号,对这些信号进行加权求和,并通过激活函数进行非线性变换,最终输出一个信号。激活函数是神经网络中不可或缺的一部分,它为网络引入了非线性因素,使得神经网络能够学习和模拟复杂的非线性关系。在本章中,我们使用了 Sigmoid 激活函数,它将输入映射到 (0, 1) 区间,具有平滑的梯度,适用于神经元的非线性变换。通过 C++ 实现的神经元类,我们展示了如何设置权重和偏置,并通过前向传播计算输出结果。

4.2 神经网络结构与前向传播

神经网络由多个神经元组成,通常分为输入层、隐藏层和输出层。前向传播是指从输入层到输出层逐层计算的过程。在本章中,我们构建了一个简单的两层神经网络,并通过 C++ 实现了其前向传播过程。隐藏层的每个神经元对输入信号进行前向传播,计算隐藏层的输出,然后将这些输出作为输出层神经元的输入,最终计算出整个网络的输出。通过设置权重和偏置,我们可以调整神经网络的行为,使其能够学习特定的任务。

4.3 深度学习框架中的关键组件

深度学习框架中的损失函数和优化算法是训练神经网络的关键。损失函数用于衡量模型的预测值与真实值之间的差异,而优化算法则用于调整模型的参数以最小化损失函数。在本章中,我们介绍了两种常见的损失函数:均方误差损失函数和交叉熵损失函数。均方误差损失函数适用于回归任务,而交叉熵损失函数则常用于分类任务。此外,我们还介绍了梯度下降优化算法,它通过计算损失函数对参数的梯度,更新参数以最小化损失。通过 C++ 实现的梯度下降优化器,我们展示了如何根据梯度和学习率更新参数。

4.4 反向传播与梯度计算

反向传播是深度学习中用于计算损失函数对模型参数梯度的关键算法。它通过链式法则从输出层向输入层逐层计算梯度。在本章中,我们详细介绍了神经元的反向传播过程,并通过 C++ 实现了相应的代码。在反向传播中,我们首先计算输出层的误差和梯度,然后通过链式法则计算隐藏层的误差和梯度。最终,我们得到了所有层的梯度,这些梯度将用于后续的参数更新。

4.5 神经网络类的构建与实现

在本章的最后,我们基于 C++ 标准库实现了一个简单的神经网络类,该类包含了前向传播和反向传播的功能。神经网络类的成员变量包括隐藏层和输出层的神经元。通过构造函数,我们根据输入层大小和隐藏层大小初始化神经网络。设置权重和偏置的函数允许我们调整网络的参数。在前向传播中,隐藏层的每个神经元对输入信号进行前向传播,计算隐藏层的输出,然后将这些输出作为输出层神经元的输入,最终计算出整个网络的输出。在反向传播中,我们计算输出层的误差和梯度,并通过链式法则计算隐藏层的误差和梯度。最终,我们得到了所有层的梯度,这些梯度将用于后续的参数更新。

  1. List item

相关文章:

C++.神经网络与深度学习(赶工版)(会二次修改)

神经网络与深度学习 1. 神经网络基础1.1 神经元模型与激活函数1.2 神经网络结构与前向传播2.1 损失函数与优化算法均方误差损失函数交叉熵损失函数梯度下降优化算法 2.2 反向传播与梯度计算神经元的反向传播 3.1 神经元类设计与实现神经元类代码实现代码思路 3.2 神经网络类构建…...

砷化镓太阳能电池:开启多元领域能源新篇

砷化镓太阳能电池作为一种高性能的光伏产品&#xff0c;具有诸多独特优势。其中&#xff0c;锗衬底砷化镓太阳能电池表现尤为突出&#xff0c;它具备高转化效率、耐辐照和高电压等特性。在空间供电电源领域&#xff0c;这些优势使其成为人造卫星、太空站、太空探测器和登陆探测…...

[Linux] vim及gcc工具

目录 一、vim 1.vim的模式 2.vim的命令集 (1):命令模式 (2):底行模式 3.vim配置 二、gcc 1.gcc格式及选项 2.工作布置 三、自动化构建工具makefile 1.基本使用方法 2.配置文件解析 3.拓展 在linux操作系统的常用工具中&#xff0c;常用vim来进行程序的编写&#xff1b…...

java加强 -stream流

Stream流是jdk8开始新增的一套api&#xff0c;可以用于操作集合或数组的内容。 Stream流大量的结合了Lambda的语法风格来编程&#xff0c;功能强大&#xff0c;性能高效&#xff0c;代码简洁&#xff0c;可读性好。 体验Stream流 把集合中所有以三开头并且三个字的元素存储到…...

RHCE认证通过率

红帽RHCE考试总体通过率38%&#xff08;2023年数据&#xff09;&#xff0c;细分数据显示自学者通过率18%&#xff0c;参加官方培训者47%&#xff0c;企业团体考生53%。通过率差异由备考资源和考试策略决定。 RHCE考试重点考Ansible自动化运维&#xff0c;需在3.5小时内完成12…...

OpenEvidence AI临床决策支持工具平台研究报告

平台概述 OpenEvidence是一个专为医疗专业人士设计的临床决策支持工具,旨在通过整合各类临床计算器和先进的人工智能技术,提高医生的诊疗决策效率和准确性。作为一款综合性医疗平台,OpenEvidence将复杂的医学计算流程简化,同时提供个性化的临床建议,使医生能够更快、更准…...

gd32e230c8t6 keil6工程模板

下载固件gd32e230c8t6固件官方下载&#xff08;需登录&#xff09; 或 蓝奏云 新建一个文件夹&#xff0c;把固件压缩包里的里的Firmware和Template拖进去 keil新建gd32e230c8工程 必须勾选CMSIS-CORE 新建一个文件夹&#xff0c;双击任意改名 点击manage project it…...

正向代理与反向代理区别及应用

正向代理和反向代理是两种常见的代理服务器类型&#xff0c;它们在网络架构中扮演不同角色&#xff0c;核心区别在于代理对象和使用场景。 1. 正向代理&#xff08;Forward Proxy&#xff09; 定义&#xff1a;正向代理是客户端&#xff08;如浏览器&#xff09;主动配置的代理…...

自然语言处理入门级项目——文本分类

文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类&#xff0c;具体而言就是判断评价属于积极还…...

UOS专业版上通过源码安装 Python 3.13 并保留系统默认版本

在 UOS 专业版上通过源码安装 Python 3.13 并保留系统默认版本&#xff0c;可按照以下步骤操作&#xff1a; 1. 安装依赖 首先安装编译 Python 所需的依赖库&#xff1a; sudo apt update sudo apt install -y build-essential zlib1g-dev libncurses5-dev \ libgdbm-dev li…...

【论文笔记】ViT-CoMer

【题目】&#xff1a;ViT-CoMer: Vision Transformer with Convolutional Multi-scale Feature Interaction for Dense Predictions 【引用格式】&#xff1a;Xia C, Wang X, Lv F, et al. Vit-comer: Vision transformer with convolutional multi-scale feature interaction…...

kaggle薅羊毛

参考&#xff1a;https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1&#xff0c;code training…...

Python 之 Flask 入门学习

安装 Flask 在开始使用 Flask 之前&#xff0c;需要先安装它。可以通过 pip 命令来安装 Flask&#xff1a; pip install Flask创建第一个 Flask 应用 创建一个简单的 Flask 应用&#xff0c;只需要几行代码。以下是一个最基本的 Flask 应用示例&#xff1a; from flask imp…...

SpringBoot Vue MySQL酒店民宿预订系统源码(支付宝沙箱支付)+代码讲解视频

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Oracle日期计算跟Mysql计算日期差距问题-导致两边计算不一致

Oracle数据库对日期做加法时&#xff0c;得到的时间是某天的12:00:00 例&#xff1a; Oracle计算 select (TO_DATE(2025-04-14, YYYY-MM-DD)1.5*365) from dual; 结果&#xff1a;2026/10/13 12:00:00Mysql计算 select DATE_ADD( str_to_date( 2025-04-14, %Y-%m-%d ), INTER…...

多线程(三)

上一期关于线程的执行&#xff0c;咱们说到线程是 “ 随机调度&#xff0c;抢占式执行 ”。所以我们对于线程之间执行的先后顺序是难以预知的。 例如咱们打篮球的时候&#xff0c;球场上的每一位运动员都是一个独立的 “ 执行流 ”&#xff0c;也可以认为是一个线程&#xff0…...

微服务商城(1)开篇、服务划分

参考&#xff1a;https://mp.weixin.qq.com/s?__bizMzg2ODU1MTI0OA&mid2247485597&idx1&sn7e85894b7847cc50df51d66092792453&scene21#wechat_redirect 为什么选择go-zero go-zero 为我们提供了许多高并发场景下的实用工具&#xff0c;比如为了降低接口耗时…...

刘强东 “猪猪侠” 营销:重构创始人IP的符号革命|创客匠人热点评述

当刘强东身着印有外卖箱猪猪侠的 T 恤漫步东京涩谷街头时&#xff0c;这场看似荒诞的行为艺术实则揭开了互联网商业竞争的新篇章。这位曾经以严肃企业家形象示人的京东创始人&#xff0c;正通过二次元 IP 的深度绑定&#xff0c;完成从商业领袖到文化符号的华丽转身。 一、IP …...

MQ消息队列的深入研究

目录 1、Apache Kafka 1.1、 kafka架构设 1.2、最大特点 1.3、功能介绍 1.4、Broker数据共享 1.5、数据一致性 2、RabbitMQ 2.1、架构图 2.2、最大特点 2.3、工作原理 2.4、功能介绍 3、RocketMQ 3.1、 架构设计 3.2、工作原理 3.3、最大特点 3.4、功能介绍 3…...

填涂颜色(bfs)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…...

FFplay 音视频同步机制解析:以音频为基准的时间校准与动态帧调整策略

1.⾳视频同步基础 1.2 简介 看视频时&#xff0c;要是声音和画面不同步&#xff0c;体验会大打折扣。之所以会出现这种情况&#xff0c;和音视频数据的处理过程密切相关。音频和视频的输出不在同一个线程&#xff0c;就像两个工人在不同车间工作&#xff0c;而且不一定会同时…...

【Linux笔记】——进程信号的捕捉——从中断聊聊OS是怎么“活起来”的

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux笔记】——进程信号的保存 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、信号捕捉的流程二、…...

VCS X-PROP建模以及在方针中的应用

VCS X-PROP建模以及在方针中的应用 摘要&#xff1a;VCS X-Prop&#xff08;X-Propagation&#xff09;是 Synopsys VCS 仿真工具中的一种高级功能&#xff0c;用于增强 X 态&#xff08;未知态&#xff09;和 Z 态&#xff08;高阻态&#xff09;在 RTL 仿真中的建模和传播能力…...

OpenSHMEM 介绍和使用指南

OpenSHMEM 介绍和使用指南 什么是 OpenSHMEM&#xff1f; OpenSHMEM 是一个用于并行计算的标准化 API&#xff0c;它提供了一种分区全局地址空间 (PGAS) 编程模型。OpenSHMEM 最初由 Cray 公司开发&#xff0c;后来成为一个开源项目&#xff0c;旨在为高性能计算提供高效的通…...

Electron入门指南:用前端技术打造桌面应用

&#x1f31f; 目录速览 什么是Electron&#xff1f;为什么要用Electron&#xff1f;核心概念三分钟掌握快速创建第一个应用典型应用场景开发注意事项常见问题解答 一、什么是Electron&#xff1f;&#x1f914; Electron就像魔法转换器&#xff0c;它能将你熟悉的&#xff1…...

机器学习第十讲:异常值检测 → 发现身高填3米的不合理数据

机器学习第十讲&#xff1a;异常值检测 → 发现身高填3米的不合理数据 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、幼儿…...

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…...

科学养生指南:打造健康生活

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。科学养生无需复杂理论&#xff0c;掌握以下几个关键要素&#xff0c;就能为身体构筑坚实的健康防线。​ 合理饮食是健康的基础。世界卫生组织建议&#xff0c;每天应摄入至少 5 份蔬菜和水果&#xff0c;保证维生…...

解锁健康生活:现代养生实用方案

早上被闹钟惊醒后匆忙灌下咖啡&#xff0c;中午用外卖应付一餐&#xff0c;深夜刷着手机迟迟不肯入睡 —— 这样的生活模式&#xff0c;正在不知不觉侵蚀我们的健康。科学养生并非遥不可及的目标&#xff0c;只需从生活细节入手&#xff0c;就能逐步改善身体状态。​ 饮食管理…...

深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)

一、核心流程概述 JVM解释器的核心任务是将Java字节码逐条翻译为本地机器指令并执行。其执行流程可分为以下关键阶段&#xff1a; 方法调用入口构建&#xff1a;生成栈帧、处理参数、同步锁等。 字节码分派&#xff08;Dispatch&#xff09;&#xff1a;根据字节码跳转到对应…...

【HCIA】BFD

前言 前面我们介绍了浮动路由以及出口路由器的默认路由配置&#xff0c;可如此配置会存在隐患&#xff0c;就是出口路由器直连的网络设备并不是运营商的路由器&#xff0c;而是交换机。此时我们就需要感知路由器的存活状态&#xff0c;这就需要用到 BFD&#xff08;Bidirectio…...

vue使用路由技术实现登录成功后跳转到首页

文章目录 一、概述二、使用步骤安装vue-router在src/router/index.js中创建路由器&#xff0c;并导出在vue应用实例中使用router声明router-view标签&#xff0c;展示组件内容 三、配置登录成功后跳转首页四、参考资料 一、概述 路由&#xff0c;决定从起点到终点的路径的进程…...

用户模块 - IP归属地框架吞吐测试

一、引言 在很多用户系统中&#xff0c;我们常常需要知道一个IP地址来自哪里&#xff0c;比如判断一个用户是否来自国内、识别异常登录等。而实现这个功能&#xff0c;通常会使用一个“IP归属地解析框架”&#xff0c;它可以根据IP地址返回国家、省份、城市等信息。 不过&#…...

生活实用小工具-手机号归属地查询

一、接口定义 手机号码归属地接口&#xff08;又称手机号查询API&#xff09;是一种通过输入手机号码&#xff0c;快速返回其归属地信息&#xff08;如省份、城市、运营商、区号等&#xff09;的应用程序接口。其数据基础来源于运营商&#xff08;移动、联通、电信&#xff09;…...

鸿蒙-5.1.0-release源码下载

源码获取 前提条件 注册码云gitee帐号。注册码云SSH公钥&#xff0c;请参考码云帮助中心。安装git客户端和git-lfs并配置用户信息。 git config --global user.name "yourname" # 这得和gitee的账号对的上 git config --global user.email "your-email-ad…...

2020年下半年试题三:论云原生架构及其应用

论文库链接&#xff1a;系统架构设计师论文 论文题目 近年来&#xff0c;随着数字化转型不断深入&#xff0c;科技创新与业务发展不断融合&#xff0c;各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下&#xff0c;以容器盒微服务…...

Flutter到HarmonyOS Next 的跨越:memory_info库的鸿蒙适配之旅

Flutter到鸿蒙的跨越&#xff1a;memory_info库的鸿蒙适配之旅 本项目作者&#xff1a;kirk/坚果 您可以使用这个Flutter插件来更改应用程序图标上的角标 作者仓库&#xff1a;https://github.com/MrOlolo/memory_info/tree/master/memory_info 在数字化浪潮的推动下&#…...

昆士兰科技大学无人机自主导航探索新框架!UAVNav:GNSS拒止与视觉受限环境中的无人机导航与目标检测

作者&#xff1a; Sebastien Boiteau, Fernando Vanegas, Felipe Gonzalez 单位&#xff1a;昆士兰科技大学电气工程与机器人学院&#xff0c;昆士兰科技大学机器人中心 论文标题&#xff1a;Framework for Autonomous UAV Navigation and Target Detection in Global-Naviga…...

uniapp设置 overflow:auto;右边不显示滚动条的问题

设置了overflow&#xff1a;auto;或者其它overflow的属性不显示滚动条是因为在uniapp中默认隐藏了滚动条 解决方法&#xff1a; //强制显示滚动条 ::-webkit-scrollbar {width: 8px !important;background: #ccc !important;display: block !important;}//设置滚动条颜色.cu-…...

基于SIP协议的VOIP话机认证注册流程分析与抓包验证

话机的认证注册报文怎么看&#xff1f; 在SIP协议中&#xff0c;当VOIP话机首次启动的时候&#xff0c;他会向SIP服务器发送一个Register请求来注册自己的信息地址&#xff0c;&#xff0c;告诉服务器 话机当前在线话机的IP地址和端口是什么话机希望接收通话的联系方式 认证注…...

JS,ES,TS三者什么区别

Java Script(JS)、ECMAScript(ES)、TypeScript(TS) 的核心区别与关联的详细解析,结合技术背景、设计目标及应用场景展开说明: 一、核心定义与关系 JavaScript(JS) 定义:一种动态类型、基于原型的脚本语言,由 Netscape 公司于 1995 年首次开发,用于网页交互功能。角…...

深度理解指针(2)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 深入理解指…...

笔记本/台式机加装PCIe 5.0固态硬盘兼容性与安装方法详解 —— 金士顿Kingston FURY Renegade G5装机指南

在2025年&#xff0c;存储设备市场迎来了革命性的升级浪潮。作为最高性能PCIe 5.0固态硬盘的代表&#xff0c;Kingston FURY Renegade G5 PCIe 5.0 NVMe M.2 固态硬盘不仅刷新了读写速度新高&#xff0c;更以优异的能耗和温控表现成为高端PC、游戏本和工作站升级的“定心丸”。…...

使用libUSB-win32的简单读写例程参考

USB上位机程序的编写&#xff0c;函数的调用过程. 调用 void usb_init(void); 进行初始化 调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数&#xff0c;获得已找到的USB总线序列&#xff1b;然后通过链表遍历所有的USB设备&#xff0c;根据已知的要打开USB设…...

Tailwind CSS 实战教程:从入门到精通

Tailwind CSS 实战教程&#xff1a;从入门到精通 前言 在Web开发的世界里&#xff0c;CSS框架层出不穷。从早期的Bootstrap到现在的Tailwind CSS&#xff0c;前端开发者们总是在寻找更高效、更灵活的样式解决方案。今天&#xff0c;我们就来深入探讨这个被称为"实用优先…...

【IC】如何获取良好的翻转数据来改进dynamic IR drop分析?

动态电压降分析是一个复杂的过程。为了成功执行适当的分析&#xff0c;需要组合多个输入文件和不同的配置设置。 切换场景是任何动态压降分析的关键。设计中的所有门电路和实例不会同时处于活动状态。此外&#xff0c;对于更复杂的单元&#xff0c;可能的切换模式会非常多。这…...

WebGL知识框架

一、WebGL 基础概念 1. WebGL 简介 是什么&#xff1f; 基于 OpenGL ES 的浏览器 3D 图形 API&#xff0c;直接操作 GPU 渲染。 核心特点 底层、高性能、需手动控制渲染管线。 依赖 JavaScript 和 GLSL&#xff08;着色器语言&#xff09;。 与 Three.js 的关系 Three.js…...

集成 ONLYOFFICE 与 AI 插件,为您的服务带来智能文档编辑器

在数字化办公浪潮中&#xff0c;文档处理效率对企业发展具有关键意义。但许多办公平台仅支持基础流程&#xff0c;查阅、批注和修改需借助外部工具&#xff0c;增加了操作复杂性和沟通成本。本文将为开发者介绍如何集成 ONLYOFFICE 文档并利用其中的 AI 插件&#xff0c;智能处…...

Simulink模型回调

Simulink 模型回调函数是一种特殊的 MATLAB 函数&#xff0c;可在模型生命周期的特定阶段自动执行。它们允许用户自定义模型行为、执行初始化任务、验证参数或记录数据。以下是各回调函数的详细说明&#xff1a; 1. PreLoadFcn 触发时机&#xff1a;Simulink 模型加载到内存之…...

网络协议分析 实验五 UDP-IPv6-DNS

文章目录 实验5.1 UDP(User Datagram Protocol)练习二 UDP单播通信练习三 利用仿真编辑器编辑UDP数据包&#xff0c;利用工具接收练习四 UDP受限广播通信练习六 利用仿真编辑器编辑IPV6的UDP数据包并发送实验5.2 DNS(Domain Name System)练习二 仿真编辑DNS查询报文&#xff08…...