从零推导一个多层感知机神经网络(附matlab源码,可直接运行)

2023-11-02

算法基础

激活函数

  • 激活函数的作用
    激活函数把非线性引入了神经网络
  • 后面的代码用到的3种激活函数
  • relu
    r e l u ( x )      =    { x x    > =    0 0 x    <    0 relu(x)\;\;=\;\left\{\begin{array}{lc}x&x\;>=\;0\\0&x\;<\;0\end{array}\right. relu(x)={x0x>=0x<0
    d ( r e l u ( x ) ) d x    =    { 1 x    > =    0 0 x    <    0 \frac{d(relu(x))}{dx}\;=\;\left\{\begin{array}{lc}1&x\;>=\;0\\0&x\;<\;0\end{array}\right. dxd(relu(x))={10x>=0x<0
  • sigmiod
    s i g m o i d ( x )    =    1 1 + e − x sigmoid(x)\;=\;\frac1{1+e^{-x}} sigmoid(x)=1+ex1
    d ( s i g m o i d ( x ) ) d x    =    1 ( 1 + e − x ) − 1 ( 1 + e − x ) 2 \frac{d(sigmoid(x))}{dx}\;=\;\frac1{(1+e^{-x})}-\frac1{{(1+e^{-x})}^2} dxd(sigmoid(x))=(1+ex)1(1+ex)21
    d ( s i g m o i d ( x ) ) d x    =    s i g m o i d ( x ) ∗ ( 1 − s i g m o i d ( x ) ) \frac{d(sigmoid(x))}{dx}\;=\;sigmoid(x)\ast(1-sigmoid(x)) dxd(sigmoid(x))=sigmoid(x)(1sigmoid(x))
  • softmax
    softmax的作用是把一个向量变成一个概率向量,下面用一个
    设X = [x1, x2]
    s o f t m a x ( X )    =    [ e x 1 e x 1 + e x 2 ,    e x 2 e x 1 + e x 2 ] softmax(X)\;=\;\lbrack\frac{e^{x1}}{e^{x1}+e^{x2}},\;\frac{e^{x2}}{e^{x1}+e^{x2}}\rbrack softmax(X)=[ex1+ex2ex1,ex1+ex2ex2]
    看下式,一个向量对一个向量求导,得到的是一个矩阵,叫做雅克比矩阵
    d ( s o f t m a x ( X ) ) d X    =    [ ∂ ( e x 1 e x 1 + e x 2 ) ∂ x 1 ∂ ( e x 2 e x 1 + e x 2 ) ∂ x 1 ∂ ( e x 1 e x 1 + e x 2 ) ∂ x 2 ∂ ( e x 2 e x 1 + e x 2 ) ∂ x 2 ]    =    [ e x 1 ∗ e x 2 ( e x 1    +    e x 2 ) 2 − e x 1 ∗ e x 2 ( e x 1    +    e x 2 ) 2 − e x 1 ∗ e x 2 ( e x 1    +    e x 2 ) 2 e x 1 ∗ e x 2 ( e x 1    +    e x 2 ) 2 ] \frac{d(softmax(X))}{dX}\;=\;\begin{bmatrix}\frac{\partial{\displaystyle(\frac{e^{x1}}{e^{x1}+e^{x2}})}}{\partial x1}&\frac{\partial{\displaystyle(\frac{e^{x2}}{e^{x1}+e^{x2}})}}{\partial x1}\\\frac{\partial{\displaystyle(\frac{e^{x1}}{e^{x1}+e^{x2}})}}{\partial x2}&\frac{\partial{\displaystyle(\frac{e^{x2}}{e^{x1}+e^{x2}})}}{\partial x2}\end{bmatrix}\;=\;\begin{bmatrix}\frac{e^{x1}\ast e^{x2}}{{(e^{x1}\;+\;e^{x2})}^2}&\frac{-e^{x1}\ast e^{x2}}{{(e^{x1}\;+\;e^{x2})}^2}\\\frac{-e^{x1}\ast e^{x2}}{{(e^{x1}\;+\;e^{x2})}^2}&\frac{e^{x1}\ast e^{x2}}{{(e^{x1}\;+\;e^{x2})}^2}\end{bmatrix} dXd(softmax(X))=x1(ex1+ex2ex1)x2(ex1+ex2ex1)x1(ex1+ex2ex2)x2(ex1+ex2ex2)=[(ex1+ex2)2ex1ex2(ex1+ex2)2ex1ex2(ex1+ex2)2ex1ex2(ex1+ex2)2ex1ex2]
    d ( s o f t m a x ( X ) ) d X    =    [ s o f t m a x ( X ) 1 ∗ s o f t m a x ( X ) 2 − s o f t m a x ( X ) 1 ∗ s o f t m a x ( X ) 2 − s o f t m a x ( X ) 1 ∗ s o f t m a x ( X ) 2 s o f t m a x ( X ) 1 ∗ s o f t m a x ( X ) 2 ] \frac{d(softmax(X))}{dX}\;=\;\begin{bmatrix}softmax{(X)}_1\ast softmax{(X)}_2&-softmax{(X)}_1\ast softmax{(X)}_2\\-softmax{(X)}_1\ast softmax{(X)}_2&softmax{(X)}_1\ast softmax{(X)}_2\end{bmatrix} dXd(softmax(X))=[softmax(X)1softmax(X)2softmax(X)1softmax(X)2softmax(X)1softmax(X)2softmax(X)1softmax(X)2]
  • 可以发现激活函数的导数是很简单的形式,这是因为反向传播的时候是要求导的,因此是故意这样设计的

损失函数

  • 损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。通俗点说就是我们在训练集里面拿一堆数据喂给模型,模型会根据这对数据预测出一个结果,这个结果和模型的权重有关,而我们的训练集会有标签,损失函数就是用来表达模型推断出来的结果和标签之间的差距的一个值,这个值越小,代表我们的模型的预测结果和我们的标签越接近,因此我们的优化目标就是要优化我们的权重,让我们的损失函数减小。
  • 我下面的示例代码实现的是分类问题,分类问题中有个经典的损失函数,交叉熵,交叉熵可以表达两个概率分布之间的差距,公式如下,下面的X1X2,都是一个n维的概率向量。
    e r o s s _ e n t r o p y ( X 1 ,    X 2 )    =    − ∑ i = 1 n X 1 i ln ⁡ ( X 2 i ) eross\_entropy(X1,\;X2)\;=\;-\sum_{i=1}^nX1_i\ln(X2_i) eross_entropy(X1,X2)=i=1nX1iln(X2i)
    我们一般把label赋值给X1, 模型预测值赋值给X2
    设X1 = [l1, l2], X2 = [x1, x2]
    δ e r o s s _ e n t r o p y ( X 1 ,    X 2 ) δ X 2    =    [ δ ( − l 1 ∗ ln ⁡ ( x 1 )    −    l 2 ∗ ln ⁡ ( x 2 ) ) δ x 1 δ ( − l 1 ∗ ln ⁡ ( x 1 )    −    l 2 ∗ ln ⁡ ( x 2 ) ) δ x 2 ]    =    [ − l 1 x 1 − l 2 x 2 ] \frac{\delta eross\_entropy(X1,\;X2)}{\delta X2}\;=\;\begin{bmatrix}\frac{\delta(-l1\ast\ln(x1)\;-\;l2\ast\ln(x2))}{\delta x1}&\frac{\delta(-l1\ast\ln(x1)\;-\;l2\ast\ln(x2))}{\delta x2}\end{bmatrix}\;=\;\begin{bmatrix}-\frac{l1}{x1}&-\frac{l2}{x2}\end{bmatrix} δX2δeross_entropy(X1,X2)=[δx1δ(l1ln(x1)l2ln(x2))δx2δ(l1ln(x1)l2ln(x2))]=[x1l1x2l2]
    如上式,标量对向量求导得到一个向量
    因为反向传播的时候也是要对损失函数求导的,所以损失函数的导数的形式也是比较简单的

链式法则

  • 上面说的,我们要优化我们的模型参数,使得损失函数尽量减小。有一种优化的方法叫做梯度下降法,还记得梯度的定义吗,梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。所以我们的模型权重就要往梯度的反方向走就可以让我们的loss很快的下降。所以现在优化问题变成了求导问题,还记得高中学的符合函数求导时用的链式法则吗,神经网络一层层前传时就是一个标准的复合函数,区别只是高中时都是标量间的求导,这里是标量对向量,向量对向量的求导。

向量求导

  • 这部分比较长,你们可以看我后面的代码,里面用matlab实现了一系列的链式求导的过程。
    这里贴上一个大佬的链接

矩阵求导总结链接

代码示例

代码文件结构说明

  • 这是我的代码的文件结构,分别为5个Function,4个Scrip,2个数据文件
    文件目录
  • 运行顺序为
    1. 运行data_gen.m (再文件夹中生成data.mat,并画出数据集分布,我给出的链接已经有了,这步可跳过)
    2. 运行mlp_relu.m或mlp_sigmoid.m (两个脚本的功能一样,都是训练一个多层感知机并把模型参数保存到varibale.mat里面,并且画出损失函数的变化趋势,这个文件已经有的话就可以跳过这一步,推荐运行mlp_relu.m,效果比较好)
    3. 运行valuate_variable.m (检验模型的性能,画出模型的分类结果,可以和data_gen.m生成的数据集做对比)

函数脚本

  • m_cross_entropy.m
    实现了求两个向量的交叉熵
function [output] = m_cross_entropy(predicts,labels)

predicts_log = -log(predicts);
output = predicts_log.*labels;
output = sum(output, 2);
output = mean(output, 1);

end
  • m_relu.m
    实现了激活函数relu
function [output] = m_relu(input)

size_input = size(input);
output = input;
for index = 1:size_input(1)*size_input(2)
    if input(index) < 0
        output(index) = 0;
    end
end

end
  • m_sigmoid.m
    实现了激活函数sigmoid
function [output] = m_sigmoid(input)

output = 1 ./ (1 + exp(-input));

end
  • m_softmax.m
    实现了激活函数softmax
function [output] = m_softmax(input)

input_exp = exp(input);
total_exp = sum(input_exp, 2);
output = input_exp ./ total_exp;

end
  • next_batch.m
    随机获取下一批数据集
function [data_output,label_output] = next_batch(data_input,label_input,batch_size)

size_input = size(data_input);
array = randperm(size_input(1));
index = array(1:batch_size);
data_output = data_input(index, :);
label_output = label_input(index, :);

end

可运行脚本

  • data_gen.m
    随机生成数据集并把数据集分布画出来
clear
class1_total = 150;
class2_total = 250;

r1 = 5*rand(1, class1_total);
theta1 = 2*pi*rand(1, class1_total);

r2 = 7+3*rand(1, class2_total);
theta2 = 2*pi*rand(1, class2_total);

x1 = r1.*cos(theta1);
y1 = r1.*sin(theta1);
x2 = r2.*cos(theta2);
y2 = r2.*sin(theta2);

X1 = [x1; y1];
X1 = X1';
X2 = [x2; y2];
X2 = X2';
labels1 = [ones(class1_total, 1), zeros(class1_total, 1)];
labels2 = [zeros(class2_total, 1), ones(class2_total, 1)];

save('data.mat', 'X1', 'X2', 'labels1', 'labels2')

plot(X1(:,1), X1(:,2), '+r', X2(:,1), X2(:,2), '*b')
title("数据集")
  • mlp_relu.m
    训练一个多层感知机并把模型参数保存到varibale.mat里面,并且画出损失函数的变化趋势,下面是几个核心的部分
    • 定义超参数
      超参数
    • 定义前向传播
      前向传播
    • 链式法则求导
      链式法则
clear

% 定义超参数
LearningRate = 0.03;
Batch_size = 128;
LayerInput_nodes = 2;
LayerHide1_nodes = 4;
LayerHide2_nodes = 3;
LayerOutput_nodes = 2;
Steps = 3000;
regulate = 0.001;

loss_array = zeros(1, Steps);

load("data.mat")
% plot(X1(:,1), X1(:,2), '+r', X2(:,1), X2(:,2), '*b')
% 数据集预处理
X_data = [X1; X2];
Y_data = [labels1; labels2];

Weight1 = normrnd(0, 1, LayerInput_nodes, LayerHide1_nodes);
% Biases1 = normrnd(0, 0.001, 1, LayerHide1_nodes);
Biases1 = zeros(1, LayerHide1_nodes) + 0.1;

Weight2 = normrnd(0, 1, LayerHide1_nodes, LayerHide2_nodes);
% Biases2 = normrnd(0, 0.001, 1, LayerHide2_nodes);
Biases2 = zeros(1, LayerHide2_nodes) + 0.1;

Weight3 = normrnd(0, 1, LayerHide2_nodes, LayerOutput_nodes);
% Biases3 = normrnd(0, 0.001, 1, LayerOutput_nodes);
Biases3 = zeros(1, LayerOutput_nodes) + 0.1;

for globel_step = 1:Steps
    % 获取本批次的数据集
    [x_batch, y_batch] = next_batch(X_data, Y_data, Batch_size);
    % Fully Connect Layer1
    y_l1 = x_batch * Weight1 + Biases1;
    y_a1 = m_relu(y_l1);
    % Fully Connect Layer2
    y_l2 = y_a1 * Weight2 + Biases2;
    y_a2 = m_relu(y_l2);
    % Fully Connect Layer3
    y_l3 = y_a2 * Weight3 + Biases3;
    y_pre = m_softmax(y_l3);
    % loss function
    loss = m_cross_entropy(y_pre, y_batch);
    % record the loss value of each batch
    loss_array(globel_step) = loss;
    % 对交叉熵函数求导
    loss_grad = -y_batch ./ y_pre;
    % 定义每一轮的权重和偏置的变化量
    Weight1_deta = zeros(size(Weight1));
    Biases1_deta = zeros(size(Biases1));
    Weight2_deta = zeros(size(Weight2));
    Biases2_deta = zeros(size(Biases2));
    Weight3_deta = zeros(size(Weight3));
    Biases3_deta = zeros(size(Biases3));
    % 遍历整个batch
    for batch_index = 1:Batch_size
        % 对softmax函数求导得到的雅克比矩阵
        softmax_jaco = [y_pre(batch_index, 1)*y_pre(batch_index, 2), -y_pre(batch_index, 1)*y_pre(batch_index, 2);
                        -y_pre(batch_index, 1)*y_pre(batch_index, 2), y_pre(batch_index, 1)*y_pre(batch_index, 2)];
        % 累加权重和偏置的梯度
        temp_yl3_grad = loss_grad(batch_index, :)*softmax_jaco;
        Biases3_deta = Biases3_deta + temp_yl3_grad;
        Weight3_deta = Weight3_deta + (y_a2(batch_index, :)' * temp_yl3_grad);
        
        temp_yl2_jaco = eye(size(y_a2, 2));
        temp_index_l2 = find(y_l2(batch_index, :) < 0);
        temp_yl2_jaco(temp_index_l2, temp_index_l2) = 0;
        temp_yl2_grad = temp_yl3_grad * Weight3' * temp_yl2_jaco;
        Biases2_deta = Biases2_deta + temp_yl2_grad;
        Weight2_deta = Weight2_deta + (y_a1(batch_index, :)' * temp_yl2_grad);
        
        temp_yl1_jaco = eye(size(y_a1, 2));
        temp_index_l1 = find(y_l1(batch_index, :) < 0);
        temp_yl1_jaco(temp_index_l1, temp_index_l1) = 0; 
        temp_yl1_grad = temp_yl2_grad * Weight2' * temp_yl1_jaco;
        Biases1_deta = Biases1_deta + temp_yl1_grad;
        Weight1_deta = Weight1_deta + (x_batch(batch_index, :)' * temp_yl1_grad);
    end
    % 权重和偏置的变化量为这一批数据的平均值乘以学习率
    Weight1_deta = -LearningRate*Weight1_deta/Batch_size;
    Biases1_deta = -LearningRate*Biases1_deta/Batch_size;
    Weight2_deta = -LearningRate*Weight2_deta/Batch_size;
    Biases2_deta = -LearningRate*Biases2_deta/Batch_size;
    Weight3_deta = -LearningRate*Weight3_deta/Batch_size;
    Biases3_deta = -LearningRate*Biases3_deta/Batch_size;
    % 更新权重和偏置
    Weight1 = Weight1 + Weight1_deta;
    Biases1 = Biases1 + Biases1_deta;
    Weight2 = Weight2 + Weight2_deta;
    Biases2 = Biases2 + Biases2_deta;
    Weight3 = Weight3 + Weight3_deta;
    Biases3 = Biases3 + Biases3_deta;
    
    % 正则化
    Weight1 = Weight1 - Weight1*regulate;
    Biases1 = Biases1 - Biases1*regulate;
    Weight2 = Weight2 - Weight2*regulate;
    Biases2 = Biases2 - Biases2*regulate;
    Weight3 = Weight3 - Weight3*regulate;
    Biases3 = Biases3 - Biases3*regulate;
end
save('variable.mat', 'Weight1', 'Biases1', 'Weight2', 'Biases2', 'Weight3', 'Biases3')
plot(loss_array)
title("relu loss value")
  • valuate_variable.m
    检验模型的性能,画出模型的分类结果,可以和data_gen.m生成的数据集做对比
clear
load('variable.mat')

THRESHOLD = 0.6;

x_input = linspace(-12, 12, 100);
y_input = linspace(-12, 12, 100);
[x_input, y_input] = meshgrid(x_input, y_input);
x_input = reshape(x_input, size(x_input, 1)*size(x_input, 2), 1);
y_input = reshape(y_input, size(y_input, 1)*size(y_input, 2), 1);
input = [x_input, y_input];

y_l1 = input * Weight1 + Biases1;
y_a1 = m_relu(y_l1);
% Fully Connect Layer2
y_l2 = y_a1 * Weight2 + Biases2;
y_a2 = m_relu(y_l2);
% Fully Connect Layer3
y_l3 = y_a2 * Weight3 + Biases3;
y_pre = m_softmax(y_l3);

index1 = find(y_pre(:, 1) > THRESHOLD);
% index1 = find(y_pre(:, 1) >= y_pre(:, 2));
class1 = input(index1, :);

index2 = find(y_pre(:, 2) > THRESHOLD);
% index2 = find(y_pre(:, 1) < y_pre(:, 2));
class2 = input(index2, :);

plot(class1(:, 1), class1(:, 2), '+b', class2(:, 1), class2(:, 2), '*r');
axis equal
title("test")

效果演示

  • 运行data_gen.m,以下是生成的数据集,圆内为一类,圆外为另一类
    数据集
  • 运行mlp_relu.m, 以下是损失函数的变化趋势,最后稳定再0.1左右
    损失函数
  • 运行valuate_variable.m,以下是模型对平面上点进行分类,可以和上面运行data_gen.m时生成的数据集做对比,模型确实学习到了数据集的特征,成功的把圆内的分成了一类,圆外的分成了一类
    验证模型

代码下载链接

  • 下面是我放在CSDN下载里面的代码压缩包,内容为我上面的代码和数据文件

代码压缩包链接

希望可以抛砖引玉,欢迎大家到评论区和我交流

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

从零推导一个多层感知机神经网络(附matlab源码,可直接运行) 的相关文章

  • Matlab-如何在曲线上绘制切线

    我在 matlab 中绘制了一个图表 plot x y 我的图表有不同的斜率 我如何在每个斜率上绘制切线并计算斜率的系数 如果您没有用于绘制点的显式函数 您可以使用有限差分 http en wikipedia org wiki Finite
  • 如何在 MATLAB 中可视化球体的交集?

    似乎这个问题在一些地方被问过 包括SO https stackoverflow com questions 35130336 draws the intersecting volume of two spheres in matlab 我最
  • Matlab:掩码/创建一个知道其原点且具有一定半径的圆形 roi

    只是一个简单的问题 我有一张图像 并且提取了某个点 特征 我知道每个帧中该点的坐标 说 x1 和 y1 我需要一个圆形 ROI 形式 该点在图像上具有我选择的半径 我尝试了 impoly 和 roipoly 当我知道图像中的要点时 不知道如
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • 在 MATLAB 中检索 spfun、cellfun、arrayfun 等中的元素索引

    有什么办法可以找回index调用函数的元素的cellfun arrayfun or spfun行为 即检索函数范围内元素的索引 为了简单起见 假设我有以下玩具示例 S spdiags 1 4 0 4 4 f spfun x 2 x S 它构
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • 不等间隔时间序列的移动平均线

    我有一个证券交易所股票价格的数据集 时间 价格 但数据点之间的间隔并不相等 从 1 到 2 分钟不等 在这种情况下计算移动平均值的最佳实践是什么 如何在Matlab中实现呢 我倾向于认为 点的权重应该取决于自上一个点以来的最后时间间隔 Ma
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • 什么是 ANN 中的纪元以及它如何转换为 MATLAB 中的代码?

    我试图理解 并可视化 训练人工神经网络的时代到底是什么 我们有一个包含约 7000 个产品的训练集 其中有 10 个特征 输入 这些产品必须根据这 10 个输入分为 7 个类别 我们的 ANN 有 10 个输入 这些输入进入由 10 个神经
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f
  • 有没有办法在matlab中进行隐式微分

    我经常使用 matlab 来帮助我解决数学问题 现在我正在寻找一种在 matlab 中进行隐式微分的方法 例如 我想区分y 3 sin x cos y exp x 0关于dy dx 我知道如何使用数学方法通常做到这一点 但我一直在努力寻找使
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列

随机推荐

  • k8s搭建高可用spring-cloud-config配置中心集群

    k8s搭建高可用配置中心 查找镜像 docker部署 关闭认证方式部署 开启认证方式部署 docker compose方式部署 k8s方式部署 使用configMap挂载配置 挂载本地目录方式 测试应用加载配置中心配置启动 查找镜像 镜像地
  • Nginx禁止某IP(段)访问的两种方法

    修改Nginx配置文件nginx conf Nginx配置访问IP可以修改nginx conf文件 只需要在server中添加allow和deny的IP即可 如下 server listen 80 server name localhost
  • 数据加载的时候出现RuntimeError: Pin memory thread exited unexpectedly

    很有可能是因为num workers太大导致的 可以调小一些
  • ch03-数值计算(进阶)

    文章目录 数学函数 三角 双曲函数 指数和对数 算术操作 自动域 数值计算 舍入 和积差 符号函数 截断 插值 导数和微积分 梯度 梯形公式 多项式 简介 便捷类 关系运算 真值测试 值和类型 逻辑运算 比较 二进制运算 位运算 左右移 打
  • 优先队列(priority_queue)总结

    文章目录 priority queue 一 优先队列简介 二 优先队列特性和操作 1 头文件 定义 2 默认优先输出大数据 1 举例 3 优先输出小数据 即小顶堆 1 举例 4 自定义优先级 重载默认的 lt 符号 1 使用 funtion
  • python爬虫——爬取电影天堂磁力链接

    爬虫 静态网页爬取 工具 pycharm python3 6 火狐浏览器 模块 requests 可以使用pip install requests安装 re 不用安装 网址 http www ygdy8 net html gndy dyzz
  • 架构--网络关键指标

    架构 网络关键指标 1 QPS Queries Per Second 每秒查询率 是一台服务器每秒能够相应的查询次数 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准 即每秒的响应请求数 也即是最大吞吐能力 2 TPS Tran
  • Stable Diffusion 系列教程

    目录 1 高清修复 1 1 原理 1 2 基本操作 1 3 优缺点 2 UpScale 放大脚本 2 1 原理 2 2 基本操作 2 3 优缺点 3 附加功能放大 3 1 原理 3 2 基本操作 3 3 优缺点 优化出图质量 产出更高清 分
  • Firefly

    Firefly 流萤 中文对话式大语言模型在本文中 笔者将介绍关于Firefly 流萤 模型的工作 一个中文对话式大语言模型 https mp weixin qq com s TX7wj8IzD EaMTvk0bjRtA一个支持中文的176
  • View 的事件分发

    事件分发机制 1 1 事件分发的顺序 Activity gt ViewGroup gt View 1 2 事件分发涉及到的方法 public boolean dispatchTouchEvent MotionEvent ev 事件过来的时候
  • k8s 概念说明,k8s面试题

    什么是Kubernetes Kubernetes是一种开源容器编排系统 可自动化应用程序的部署 扩展和管理 Kubernetes 中的 Master 组件有哪些 Kubernetes 中的 Master 组件包括 API Server et
  • 4-ubuntu22.04-安装QT-5.15.2

    ubuntu22 04 安装QT 5 15 2 一 Ubuntu换源 二 命令行安装QT 5 15 2 三 配置环境变量 四 QT安装选择 五 QT环境依赖安装gcc和g 一 Ubuntu换源 换源注意根据自己系统的版本进行换源 有 bio
  • ElasticSearch适配器adapter的使用及配置

    文章目录 前言 一 修改启动器配置 application yml 二 适配器表映射文件 修改 conf es mytest user yml文件 单表映射索引示例sql 单表映射索引示例sql带函数或运算操作 多表映射 一对一 多对一 索
  • 计算机磁盘管理进行磁盘转移,将磁盘移到另一台计算机

    将磁盘移到另一台计算机 10 12 2017 本文内容 适用于 Windows 10 Windows 8 1 Windows Server 半年频道 Windows Server 2016 Windows Server 2012 R2 Wi
  • Hive 分组

    2 1 Group By 语句 GROUP BY 语句通常会和聚合函数一起使用 按照一个或者多个列队结果进行分组 然 后对每个组执行聚合操作 1 案例实操 1 计算 emp 表每个部门的平均工资 hive default gt select
  • 雪花算法(SnowFlake)

    简介 现在的服务基本是分布式 微服务形式的 而且大数据量也导致分库分表的产生 对于水平分表就需要保证表中 id 的全局唯一性 对于 MySQL 而言 一个表中的主键 id 一般使用自增的方式 但是如果进行水平分表之后 多个表中会生成重复的
  • Java线程的同步机制(synchronized关键字)

    线程的同步机制 synchronized 1 背景 例子 创建个窗口卖票 总票数为100张 使用实现Runnable接口的方式 1 问题 卖票过程中 出现了重票 错票 gt 出现了线程的安全问题 2 问题出现的原因 当某个线程操作车票的过程
  • spring中的扩展点解析以及实践使用

    文章目录 1 ApplicationContextInitializer 2 BeanDefinitionRegistryPostProcessor 3 BeanFactoryPostProcessor 4 InstantiationAwa
  • 西门子S7-200 PLC接地和接线

    对于所有的电器设备 接地和接线是非常重要的 它能够确保系统具备最优的操作特性 同时能够为系统提供更好的电子噪声保护 在接地和接线之前 必须先确保设备的电源已被切断 也要保证与该设备相关的设备电源已被切断 在对S7 200及其相关设备接线时
  • 从零推导一个多层感知机神经网络(附matlab源码,可直接运行)

    可以先跳到代码示例部分看看效果 算法基础 激活函数 损失函数 链式法则 向量求导 代码示例 代码文件结构说明 函数脚本 可运行脚本 效果演示 代码下载链接 算法基础 激活函数 激活函数的作用 激活函数把非线性引入了神经网络 后面的代码用到的