LeNet-5簡介及matlab實現

文章目錄

  • 一、LeNet-5網絡結構簡介
  • 二、LeNet-5每一層的實現原理
    • 2.1. 第一層 (C1) :卷積層(Convolution Layer)
    • 2.2. 第二層 (S2) :池化層(Pooling Layer)
    • 2.3. 第三層(C3):卷積層(Convolution Layer)
    • 2.4. 第四層(S4):池化層(Pooling Layer)
    • 2.5. 第五層(C5):卷積層(全連接卷積層)
    • 2.6. 第六層(F6):全連接層(Fully Connected Layer)
    • 2.7. 第七層(Output):全連接輸出層(Softmax分類層)
  • 三、matlab實現LeNet-5
  • 四、訓練測試網絡

LeNet-5是一種經典的卷積神經網絡(CNN),由Yann LeCun等人提出,最初用于手寫數字識別任務。它的結構簡單清晰,為CNN的發展奠定了基礎。

一、LeNet-5網絡結構簡介

LeNet-5的網絡結構如下圖所示

在這里插入圖片描述

詳細參數:

層名類型輸入尺寸尺寸輸出尺寸激活函數
輸入圖片28×28×1-32×32×1
C1卷積28×28×1,padding為25×5, 6個卷積核,步長為128×28×6relu
S2池化28×28×62×2 池化,步長為214×14×6
C3卷積14×14×6,padding為05×5, 16個卷積核10×10×16relu
S4池化10×10×162×2 池化,步長為25×5×16
C5卷積(全連接卷積)5×5×165×5, 120個卷積核120×1relu
F6全連接層120全連接84×1relu
輸出全連接層84全連接10 (數字類別)softmax

二、LeNet-5每一層的實現原理

2.1. 第一層 (C1) :卷積層(Convolution Layer)

輸入: 一張灰度圖像,尺寸為 28 × 28 × 1 28\times28\times1 28×28×1

參數:

  • 卷積核尺寸為 5 × 5 5\times5 5×5,共 6個卷積核
  • 偏置項 (bias):每個卷積核對應一個獨立的偏置值,因此共有6個偏置值。

輸出: 經過卷積后的特征圖,共6個,尺寸為 28 × 28 × 6 28\times28\times6 28×28×6

(1)卷積計算原理:

卷積層本質上是將卷積核(濾波器)與輸入圖像進行卷積操作:
Output ( x , y ) = f ( ∑ i = 1 5 ∑ j = 1 5 Kernel ( i , j ) × Input ( x + i , y + j ) + b ) \text{Output}(x,y) = f\left(\sum_{i=1}^{5}\sum_{j=1}^{5}\text{Kernel}(i,j)\times\text{Input}(x+i,y+j)+b\right) Output(x,y)=f(i=15?j=15?Kernel(i,j)×Input(x+i,y+j)+b)

  • 這里:
    • Kernel ( i , j ) \text{Kernel}(i,j) Kernel(i,j):表示卷積核的第 i i i行、第 j j j列元素的數值。
    • Input ( x + i , y + j ) \text{Input}(x+i,y+j) Input(x+i,y+j):表示輸入圖像中對應位置上的數值。
    • b b b:表示該卷積核的偏置項(bias)。
    • f ( ? ) f(\cdot) f(?):激活函數(例如sigmoid或tanh函數或relu函數),推薦使用relu函數。

上面公式中求和部分的計算原理可以通過下面簡單的例子理解

在這里插入圖片描述

(2)輸出特征圖尺寸的計算:

卷積后輸出尺寸計算公式為:
Output?Size = ( Input?Size ? Kernel?Size ) + 2 × Padding?Size Stride + 1 \text{Output Size} = \frac{(\text{Input Size}-\text{Kernel Size})+2\times\text{Padding Size}}{\text{Stride}} + 1 Output?Size=Stride(Input?Size?Kernel?Size)+2×Padding?Size?+1

  • 輸入:28×28,卷積核:5×5,Stride(步長)=1,padding=2時,計算結果為:

( 28 ? 5 ) + 2 × 2 1 + 1 = 28 \frac{(28 - 5)+2\times2}{1} + 1 = 28 1(28?5)+2×2?+1=28

  • 因此,輸出特征圖為28×28,6個卷積核則輸出為28×28×6。

對于padding的理解,可以通過下面簡單的例子理解

當padding為0時

在這里插入圖片描述

當padding為2時

在這里插入圖片描述

2.2. 第二層 (S2) :池化層(Pooling Layer)

輸入: C1層輸出特征圖,共6個,尺寸為 28 × 28 × 6 28\times28\times6 28×28×6

參數:

  • 池化(Pooling)窗口大小: 2 × 2 2\times2 2×2,步長(Stride)= 2。
  • 無需額外參數,無權值,通常采用平均池化或最大池化,推薦使用最大池化。

輸出: 池化后的特征圖,共6個,尺寸為 14 × 14 × 6 14\times14\times6 14×14×6

(1)池化計算原理:

池化層的作用是降低特征圖的尺寸,同時提取特征的重要信息,增強網絡的泛化能力。

常見池化方法:

  • 平均池化(Average Pooling): 取池化窗口區域內所有像素值的平均值作為輸出。

    例如窗口區域:
    [ 2 4 6 8 ] \begin{bmatrix} 2 & 4\\ 6 & 8 \end{bmatrix} [26?48?]
    平均池化的結果為:
    2 + 4 + 6 + 8 4 = 5 \frac{2+4+6+8}{4}=5 42+4+6+8?=5

  • 最大池化(Max Pooling): 取池化窗口區域內的最大像素值作為輸出。

    以上面的區域為例:
    max ? { 2 , 4 , 6 , 8 } = 8 \max\{2,4,6,8\}=8 max{2,4,6,8}=8

LeNet-5原論文中使用的是平均池化

一個圖形化的例子如下所示

在這里插入圖片描述

(2)輸出特征圖尺寸的計算:

池化后輸出尺寸計算公式為:
Output?Size = Input?Size ? Pooling?Size Stride + 1 \text{Output Size} = \frac{\text{Input Size}-\text{Pooling Size}}{\text{Stride}} + 1 Output?Size=StrideInput?Size?Pooling?Size?+1

  • 輸入:28×28,池化窗口:2×2,Stride=2時,計算結果為:

28 ? 2 2 + 1 = 14 \frac{28-2}{2}+1=14 228?2?+1=14

  • 所以S2層輸出特征圖為 14 × 14 × 6 14\times14\times6 14×14×6

2.3. 第三層(C3):卷積層(Convolution Layer)

輸入: 第二層(S2)輸出,尺寸為 14 × 14 × 6 14 \times 14 \times 6 14×14×6

參數:

  • 卷積核大小為 5 × 5 5\times 5 5×5,共 16個卷積核
  • 偏置(bias):每個卷積核一個偏置,共16個偏置。

這里卷積的計算需要注意的是,輸入是多個通道了,這種情況下的計算可以通過下面的圖示理解

在這里插入圖片描述

一個簡單的計算示例如下,這里輸入是 4 × 4 × 3 4\times 4\times3 4×4×3,卷積核大小為 3 × 3 3\times3 3×3,但是也要是三通道

在這里插入圖片描述

2.4. 第四層(S4):池化層(Pooling Layer)

輸入: 第三層(C3)輸出,尺寸為 10 × 10 × 16 10\times10\times16 10×10×16

參數:

  • 池化窗口大小: 2 × 2 2\times2 2×2,步長: 2 2 2
  • LeNet-5使用平均池化(Average Pooling),輸出特征圖尺寸為: 5 × 5 × 16 5\times5\times16 5×5×16

2.5. 第五層(C5):卷積層(全連接卷積層)

輸入:第四層(S4)輸出特征圖,尺寸為 5 × 5 × 16 5\times5\times16 5×5×16

參數

  • 卷積核尺寸: 5 × 5 5\times5 5×5
  • 卷積核數量:120個
  • 偏置數量:120個(每個卷積核對應1個偏置)

由于輸入特征圖大小為 5 × 5 × 16 5\times5\times 16 5×5×16,而卷積核也為 5 × 5 5\times5 5×5,因此每個卷積核與輸入特征圖卷積后會變成 1 × 1 1\times1 1×1 的輸出,這相當于對整個特征圖做了全連接卷積(即卷積核與整個輸入特征圖區域進行完全連接)。因此,這一層又稱為 全連接卷積層

2.6. 第六層(F6):全連接層(Fully Connected Layer)

輸入:第五層(C5)輸出,共120個神經元(1維向量)。

參數

  • 全連接層的神經元數量:84個
  • 權重數量: 84 × 120 84\times120 84×120(120個輸入與84個神經元全連接)
  • 偏置數量:84個(每個神經元一個偏置)

全連接層的計算本質為矩陣乘法+偏置+激活函數:

  • 計算公式:

Output = f ( W × Input ( 120 × 1 ) + b ) \text{Output} = f\left(W \times \text{Input}_{(120\times1)}+b\right) Output=f(W×Input(120×1)?+b)

其中:

  • W W W:是一個大小為 84 × 120 84\times120 84×120 的權重矩陣
  • b b b:大小為 84 × 1 84\times1 84×1 偏置向量
  • f f f:激活函數(如tanh或sigmoid)
  • 輸出為84維的向量,即大小為: 84 × 1 84\times1 84×1

2.7. 第七層(Output):全連接輸出層(Softmax分類層)

輸入:第六層(F6)輸出的84個神經元(向量)。

參數

  • 輸出類別:10個類別(0-9手寫數字)
  • 權重數量: 10 × 84 10\times84 10×84(84個輸入與10個輸出神經元全連接)
  • 偏置數量:10個(每個輸出神經元對應1個偏置)

最后一層通常是全連接層,并使用softmax函數作為分類器:

  • 計算公式:

Z j = ∑ i = 1 84 w j , i x i + b j , j = 1 , 2 , . . . , 10 Z_j = \sum_{i=1}^{84}w_{j,i}x_i + b_j,\quad j=1,2,...,10 Zj?=i=184?wj,i?xi?+bj?,j=1,2,...,10

其中:

  • Z j Z_j Zj?:第 j j j個類別的線性輸出值
  • w j , i w_{j,i} wj,i?:第 j j j個輸出神經元與第 i i i個輸入神經元的權重
  • b j b_j bj?:第 j j j個輸出神經元的偏置

計算Softmax概率:
y j = e Z j ∑ k = 1 10 e Z k y_j = \frac{e^{Z_j}}{\sum_{k=1}^{10}e^{Z_k}} yj?=k=110?eZk?eZj??

  • y j y_j yj?:為第 j j j 類別的概率值,所有 y j y_j yj? 和為1。
  • 最終預測類別即為概率最大的類別。
  • 輸出尺寸為: 10 × 1 10\times1 10×1,表示10個類別的概率分布。

分析完每一層的原理后,我們就可以計算一下這個網絡的可學習參量了

第一層:卷積核尺寸為 5 × 5 5\times5 5×5,共 6個卷積核,考慮到一個卷積核對應一個偏置量,所以
5 × 5 × 6 + 6 = 156 5\times5\times6+6=156 5×5×6+6=156
第二層:池化層無需要學習參量

第三層:卷積核大小為 5 × 5 5\times 5 5×5,共 16個卷積核,因為這一層的輸入是6個通道,并考慮到偏置量,所以
5 × 5 × 6 × 16 + 16 = 2416 5\times5\times6\times16+16=2416 5×5×6×16+16=2416
第四層:池化層無需要學習參量

第五層:卷積核大小為 5 × 5 5\times 5 5×5,共 120個卷積核,因為這一層的輸入是16個通道,并考慮到偏置量,所以
5 × 5 × 16 × 120 + 120 = 48120 5\times5\times16\times120+120=48120 5×5×16×120+120=48120
第六層:學習參數為權重數量加偏置,所以
84 × 120 + 84 = 10164 84\times120+84=10164 84×120+84=10164
第七層:學習參數為權重數量加偏置,所以
10 × 84 + 10 = 850 10\times84+10=850 10×84+10=850
所以,這個網絡的總學習參數為
156 + 2416 + 48120 + 10164 + 850 = 61706 156+2416+48120+10164+850=61706 156+2416+48120+10164+850=61706

三、matlab實現LeNet-5

這里,我們需要借用到matlab工具欄里APPS里的Deep Network Designer,如下圖所示

在這里插入圖片描述

在Deep Network Designer, 我們創建一個空白Designer畫布

在這里插入圖片描述

然后我們可以拖動相應的層到Designer里,并連接各個層,如下圖所示

在這里插入圖片描述

然后,我們需要設置各個層的參量,對于輸入圖像來說

在這里插入圖片描述

第一層:

在這里插入圖片描述

第二層:注意到第一層和二層之間有一個Batchnormalization和激活函數,Batchnormalization一般是為了讓訓練效果更好,所有的卷積層和全連接層后一般都跟激活函數
在這里插入圖片描述

第三層:

在這里插入圖片描述

第四層:

在這里插入圖片描述

第五層:

在這里插入圖片描述

第六層:

在這里插入圖片描述

第七層:

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/4b903413d16047218c7c0ea6df617a14.png#pic_center -=400x)

設置完成后,我們就可以用Analyze這個按鈕分析這個網絡了,分析內容很詳細,可以看到這個網絡的可學習參量為61.7k,跟我們上面計算的結果相同。至此,我們就完成了LeNet-5的搭建。

在這里插入圖片描述

然后用Export按鈕輸出到工作區,這個網絡的名稱會自動命名為net_1。

在這里插入圖片描述

四、訓練測試網絡

加載圖像數據集

dataFolder = "DigitsData";  % 指定圖像數據所在的文件夾路徑
imds = imageDatastore(dataFolder, ...IncludeSubfolders=true, ...        % 包括子文件夾中的圖像LabelSource="foldernames");        % 使用文件夾名稱作為圖像的標簽

imageDatastore 用于批量加載圖像,并自動將圖像按文件夾名稱分類(用于監督學習)。


在這里插入圖片描述

可視化部分圖像

figure
tiledlayout("flow");                  % 設置自適應布局以顯示多個圖像
perm = randperm(10000, 20);          % 從 10000 張圖像中隨機選取 20 張
for i = 1:20nexttile                         % 在下一圖塊中顯示圖像imshow(imds.Files{perm(i)});    % 顯示圖像文件路徑對應的圖像
end

隨機選出 20 張圖像用于展示,驗證數據是否正確讀取和標注。


在這里插入圖片描述

查看類別和樣本數量

classNames = categories(imds.Labels);     % 提取所有類別名稱
labelCount = countEachLabel(imds);        % 統計每個類別的圖像數量

有助于檢查數據是否均衡,每類是否數量相近。


查看圖像尺寸

matlab復制編輯img = readimage(imds,1);     % 讀取第 1 張圖像
size(img)                  % 查看圖像尺寸(應該為 28×28×1)

確保圖像大小和通道數(灰度或彩色)與網絡輸入一致。


劃分訓練集、驗證集、測試集

[imdsTrain, imdsValidation, imdsTest] = splitEachLabel(imds, 0.7, 0.15, 0.15, "randomized");

從每個類別中隨機劃分出 70% 用于訓練,15% 用于驗證,15% 用于測試。


設置訓練選項

options = trainingOptions("sgdm", ...InitialLearnRate=0.01, ...             % 初始學習率MaxEpochs=4, ...                       % 最大訓練輪數Shuffle="every-epoch", ...             % 每個 epoch 打亂訓練數據ValidationData=imdsValidation, ...     % 指定驗證數據集ValidationFrequency=30, ...            % 每訓練 30 個 mini-batch 進行一次驗證Plots="training-progress", ...         % 實時顯示訓練過程圖表Metrics="accuracy", ...                % 關注準確率指標Verbose=false);                        % 不在命令行輸出詳細訓練信息

控制訓練過程的關鍵參數,適用于小型數據集的快速實驗。


訓練神經網絡

net = trainnet(imdsTrain, net_1, "crossentropy", options);

使用自定義網絡 net_1 和交叉熵損失函數對訓練集進行訓練,返回訓練好的網絡 net


在這里插入圖片描述

在測試集上評估準確率

accuracy = testnet(net, imdsTest, "accuracy");

在未見過的測試集上評估模型性能,輸出預測準確率(值范圍 0~1)。


進行預測并生成標簽

scores = minibatchpredict(net, imdsTest);               % 對測試集進行批量預測,輸出每類得分
YTest = scores2label(scores, classNames);               % 將得分轉換為預測的標簽

scores 是每張圖像對每個類別的得分;scores2label 會選擇得分最高的類別作為預測結果。


可視化預測結果

numTestObservations = numel(imdsTest.Files);        % 測試集中圖像的總數
idx = randi(numTestObservations, 9, 1);             % 隨機選取 9 個圖像索引用于展示figure
tiledlayout("flow")                                 % 設置圖像自動排列布局
for i = 1:9nexttileimg = readimage(imdsTest, idx(i));              % 讀取圖像imshow(img)                                     % 顯示圖像title("Predicted Class: " + string(YTest(idx(i))))  % 顯示預測類別
end

隨機從測試集中挑選 9 張圖像,并在圖像上標注預測的類別結果,可用于人工評估模型表現。

在這里插入圖片描述

完整代碼如下

%%
dataFolder = "DigitsData";  % 指定圖像數據所在的文件夾路徑
imds = imageDatastore(dataFolder, ...IncludeSubfolders=true, ...        % 包括子文件夾中的圖像LabelSource="foldernames");        % 使用文件夾名稱作為圖像的標簽figure
tiledlayout("flow");                  % 設置自適應布局以顯示多個圖像
perm = randperm(10000, 20);          % 從 10000 張圖像中隨機選取 20 張
for i = 1:20nexttile                         % 在下一圖塊中顯示圖像imshow(imds.Files{perm(i)});    % 顯示圖像文件路徑對應的圖像
end
%%
classNames = categories(imds.Labels);     % 提取所有類別名稱
labelCount = countEachLabel(imds);        % 統計每個類別的圖像數量%%
img = readimage(imds,1);     % 讀取第 1 張圖像
size(img);                   % 查看圖像尺寸(應該為 28×28×1)%%
% 從每個類別中隨機劃分出 70% 用于訓練,15% 用于驗證,15% 用于測試。
[imdsTrain, imdsValidation, imdsTest] = splitEachLabel(imds, 0.7, 0.15, 0.15, "randomized");%%
% options = trainingOptions("sgdm", ...
%     InitialLearnRate=0.01, ...
%     MaxEpochs=4, ...
%     Shuffle="every-epoch", ...
%     ValidationData=imdsValidation, ...
%     ValidationFrequency=30, ...
%     Plots="training-progress", ...
%     Metrics="accuracy", ...
%     Verbose=false);
options = trainingOptions("sgdm", ...InitialLearnRate=0.01, ...             % 初始學習率MaxEpochs=4, ...                       % 最大訓練輪數Shuffle="every-epoch", ...             % 每個 epoch 打亂訓練數據ValidationData=imdsValidation, ...     % 指定驗證數據集ValidationFrequency=30, ...            % 每訓練 30 個 mini-batch 進行一次驗證Plots="training-progress", ...         % 實時顯示訓練過程圖表Metrics="accuracy", ...                % 關注準確率指標Verbose=false);                        % 不在命令行輸出詳細訓練信息%%
% 使用自定義網絡 net_1 和交叉熵損失函數對訓練集進行訓練,返回訓練好的網絡 net。
net = trainnet(imdsTrain,net_1,"crossentropy",options);% 在未見過的測試集上評估模型性能,輸出預測準確率(值范圍 0~1)。
accuracy = testnet(net, imdsTest, "accuracy");scores = minibatchpredict(net, imdsTest);               % 對測試集進行批量預測,輸出每類得分
YTest = scores2label(scores, classNames);               % 將得分轉換為預測的標簽numTestObservations = numel(imdsTest.Files);        % 測試集中圖像的總數
idx = randi(numTestObservations, 9, 1);             % 隨機選取 9 個圖像索引用于展示figure
tiledlayout("flow")                                 % 設置圖像自動排列布局
for i = 1:9nexttileimg = readimage(imdsTest, idx(i));              % 讀取圖像imshow(img)                                     % 顯示圖像title("Predicted Class: " + string(YTest(idx(i))))  % 顯示預測類別
end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74694.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LLM】MCP(Python):實現 stdio 通信的Client與Server

本文將詳細介紹如何使用 Model Context Protocol (MCP) 在 Python 中實現基于 STDIO 通信的 Client 與 Server。MCP 是一個開放協議,它使 LLM 應用與外部數據源和工具之間的無縫集成成為可能。無論你是構建 AI 驅動的 IDE、改善 chat 交互,還是構建自定義…

Docker 安裝 Elasticsearch 教程

目錄 一、安裝 Elasticsearch 二、安裝 Kibana 三、安裝 IK 分詞器 四、Elasticsearch 常用配置 五、Elasticsearch 常用命令 一、安裝 Elasticsearch (一)創建 Docker 網絡 因為后續還需要部署 Kibana 容器,所以需要讓 Elasticsearch…

Swagger @ApiOperation

ApiOperation 注解并非 Spring Boot 自帶的注解,而是來自 Swagger 框架,Swagger 是一個規范且完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務,而 ApiOperation 主要用于為 API 接口的操作添加描述信息。以下為…

【奇點時刻】GPT4o新圖像生成模型底層原理深度洞察報告(篇2)

由于上一篇解析深度不足,經過查看學習相關論文,以下是一份對 GPT-4o 最新的圖像生成模型 的深度梳理與洞察,從模型原理到社區解讀、對比傳統擴散模型,再到對未來趨勢的分析。為了便于閱讀,整理成以下七個部分&#xff…

C# 窗體應用(.FET Framework ) 打開文件操作

一、 打開文件或文件夾加載數據 1. 定義一個列表用來接收路徑 public List<string> paths new List<string>();2. 打開文件選擇一個文件并將文件放入列表中 OpenFileDialog open new OpenFileDialog(); // 過濾 open.Filter "(*.jpg;*.jpge;*.bmp;*.png…

Scala 面向對象編程總結

???抽象屬性和抽象方法 基本語法 定義抽象類&#xff1a;abstract class Person{} //通過 abstract 關鍵字標記抽象類定義抽象屬性&#xff1a;val|var name:String //一個屬性沒有初始化&#xff0c;就是抽象屬性定義抽象方法&#xff1a;def hello():String //只聲明而沒…

人工智能賦能工業制造:智能制造的未來之路

一、引言 隨著人工智能技術的飛速發展&#xff0c;其應用場景不斷拓展&#xff0c;從消費電子到醫療健康&#xff0c;從金融科技到交通運輸&#xff0c;幾乎涵蓋了所有行業。而工業制造作為國民經濟的支柱產業&#xff0c;也在人工智能的浪潮中迎來了深刻的變革。智能制造&…

元宇宙概念下,UI 設計如何打造沉浸式體驗?

一、元宇宙時代UI設計的核心趨勢 在元宇宙概念下&#xff0c;UI設計的核心目標是打造沉浸式體驗&#xff0c;讓用戶在虛擬世界中感受到身臨其境的交互效果。以下是元宇宙時代UI設計的幾個核心趨勢&#xff1a; 沉浸式體驗設計 元宇宙的核心是提供沉浸式體驗&#xff0c;UI設計…

AI 如何幫助我們提升自己,不被替代

在當今快速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;正逐漸滲透到生活的方方面面。許多人擔心 AI 會取代人類的工作&#xff0c;然而&#xff0c;AI 更多的是作為一種強大的賦能工具&#xff0c;幫助我們提升自身能力&#xff0c;讓我們在工作中更具競爭力。以…

基于SpringBoot+Vue實現的二手交易市場平臺功能一

一、前言介紹&#xff1a; 1.1 項目摘要 隨著社會的發展和人們生活水平的提高&#xff0c;消費者購買能力的提升導致產生了大量的閑置物品&#xff0c;這些閑置物品具有一定的經濟價值。特別是在高校環境中&#xff0c;學生群體作為一個具有一定消費水平的群體&#xff0c;每…

k8s安裝cri驅動創建storageclass動態類

部署nfs服務器 #所有k8s節點安裝nfs客戶端 yum install -y nfs-utils mkdir -p /nfs/share echo "/nfs/share *(rw,sync,no_root_squash)" >> /etc/exports systemctl enable --now nfs-serverhelm部署nfs的provisioner&sc 所有k8s節點安裝客戶端 yu…

SpringBoot + Netty + Vue + WebSocket實現在線聊天

最近想學學WebSocket做一個實時通訊的練手項目 主要用到的技術棧是WebSocket Netty Vue Pinia MySQL SpringBoot&#xff0c;實現一個持久化數據&#xff0c;單一群聊&#xff0c;支持多用戶的聊天界面 下面是實現的過程 后端 SpringBoot啟動的時候會占用一個端口&#xff…

大數據Spark(五十七):Spark運行架構與MapReduce區別

文章目錄 Spark運行架構與MapReduce區別 一、Spark運行架構 二、Spark與MapReduce區別 Spark運行架構與MapReduce區別 一、Spark運行架構 Master:Spark集群中資源管理主節點&#xff0c;負責管理Worker節點。Worker:Spark集群中資源管理的從節點&#xff0c;負責任務的運行…

【爬蟲】網頁抓包工具--Fiddler

網頁抓包工具對比&#xff1a;Fiddler與Sniff Master Fiddler基礎知識 Fiddler是一款強大的抓包工具&#xff0c;它的工作原理是作為web代理服務器運行&#xff0c;默認代理地址是127.0.0.1&#xff0c;端口8888。代理服務器位于客戶端和服務器之間&#xff0c;攔截所有HTTP/…

Redis:集群

為什么要有集群&#xff1f; Redis 集群&#xff08;Redis Cluster&#xff09;是 Redis 官方提供的分布式解決方案&#xff0c;用于解決單機 Redis 在數據容量、并發處理能力和高可用性上的局限。通過 Redis 集群&#xff0c;可以實現數據分片、故障轉移和高可用性&#xff0…

【2012】【論文筆記】太赫茲波在非磁化等離子體——

前言 類型 太赫茲 + 等離子體 太赫茲 + 等離子體 太赫茲+等離子體 期刊 物理學報 物理學報 物理學報 作者

Linux字符驅動設備開發入門之框架搭建

聲明 本博客所記錄的關于正點原子i.MX6ULL開發板的學習筆記&#xff0c;&#xff08;內容參照正點原子I.MX6U嵌入式linux驅動開發指南&#xff0c;可在正點原子官方獲取正點原子Linux開發板 — 正點原子資料下載中心 1.0.0 文檔&#xff09;&#xff0c;旨在如實記錄我在學校學…

小剛說C語言刷題——第15講 多分支結構

1.多分支結構 所謂多分支結構是指在選擇的時候有多種選擇。根據條件滿足哪個分支&#xff0c;就走對應分支的語句。 2.語法格式 if(條件1) 語句1; else if(條件2) 語句2; else if(條件3) 語句3; ....... else 語句n; 3.示例代碼 從鍵盤輸入三條邊的長度&#xff0c;…

Apache httpclient okhttp(1)

學習鏈接 Apache httpclient & okhttp&#xff08;1&#xff09; Apache httpclient & okhttp&#xff08;2&#xff09; httpcomponents-client github apache httpclient文檔 apache httpclient文檔詳細使用 log4j日志官方文檔 【Java基礎】- HttpURLConnection…

洛谷題單3-P1420 最長連號-python-流程圖重構

題目描述 輸入長度為 n n n 的一個正整數序列&#xff0c;要求輸出序列中最長連號的長度。 連號指在序列中&#xff0c;從小到大的連續自然數。 輸入格式 第一行&#xff0c;一個整數 n n n。 第二行&#xff0c; n n n 個整數 a i a_i ai?&#xff0c;之間用空格隔開…