吳恩達深度學習——有效運作神經網絡

內容來自https://www.bilibili.com/video/BV1FT4y1E74V,僅為本人學習所用。

文章目錄

  • 訓練集、驗證集、測試集
  • 偏差、方差
  • 正則化
    • 正則化參數
    • 為什么正則化可以減少過擬合
    • Dropout正則化
      • Inverted Dropout
      • 其他的正則化方法
        • 數據增廣
        • Early stopping
  • 歸一化
  • 梯度消失與梯度爆炸
    • 產生原因
    • 權重初始化
      • He初始化
      • Xavier初始化
  • 梯度檢驗
    • 梯度的數值逼近
    • 步驟(如上圖)
    • 一些建議

訓練集、驗證集、測試集

  • 訓練集:用于訓練模型的數據集。通過學習訓練集中的數據特征和標簽之間的關系,來調整自身的參數,以盡可能準確地對數據進行擬合。
  • 驗證集:在模型訓練過程中對模型進行評估和調整。在訓練過程中,使用驗證集可以監控模型的性能,如準確率、損失函數值,根據驗證集上的表現來選擇最優的模型參數。
  • 測試集:在模型訓練和調優完成后,最終評估模型的性能。是一組完全獨立于訓練集和驗證集的數據,測試模型在實際應用中的泛化能力和準確性,判斷模型是否能夠很好地處理未見過的數據。

一般來說,數據集按照6:2:2或7:2:1的比例劃分為訓練集、驗證集和測試集。對于數據量非常大的數據集,驗證集和測試集的比例可以降低,比如95:2.5:2.5;而對于數據量較小的數據集,可以使用上述的原則。

有的時候會遇到這樣的場景:訓練一個識別貓的模型,訓練的時候使用的訓練集是大小固定,分辨率較低的圖片,但是在測試的時候使用的驗證集、測試集是隨機大小的,分辨率比較高的圖片。這兩類圖片是不同的,應該確保訓練集和驗證機、測試集的數據是同一個分布

在訓練集上訓練數據,嘗試使用不同的模型框架;在驗證集上評估這些模型,迭代選出適用的模型;最后測試。

偏差、方差

偏差是模型的預測值(期望輸出)與真實值之間的差異。高偏差意味著模型過于簡單,不能很好地捕捉數據中的復雜模式和特征,導致模型在訓練集和測試集上的表現都較差,出現欠擬合現象。
方差描述的是模型對于給定數據集的預測結果的離散程度。如果模型在不同的訓練數據集上訓練后,得到的模型參數差異很大,導致預測結果波動較大,那么這個模型的方差就很高。高方差通常是因為模型過于復雜,對訓練數據中的噪聲和特定樣本的特征過度擬合,在訓練集上表現很好,但在測試集等新數據上表現不佳,出現過擬合現象。

偏差反映的是模型本身的擬合能力。從數學角度看,偏差衡量的是模型的期望預測與真實值之間的偏離程度;方差衡量的是模型預測結果的穩定性。
在這里插入圖片描述

  • 左圖 - high bias(高偏差):也叫欠擬合。模型過于簡單,無法很好地捕捉數據中的規律和特征,導致在訓練集上的表現就很差,對數據的擬合程度低。圖中用一條簡單的直線去劃分兩類數據點(圓圈和叉叉),明顯沒有很好地分開數據,在訓練集上的誤差就較大,更不用說在新數據上的表現了。
  • 中圖 - just right(正好):也叫適度擬合。模型復雜度適中,能夠較好地學習到數據中的模式,既不會過于簡單而無法擬合數據,也不會過于復雜而只對訓練數據表現好。圖中用一條曲線比較合理地劃分了兩類數據點,在訓練集上有較好的擬合效果,同時也有較好的泛化能力,在新數據上也能有不錯的表現。
  • 右圖 - high variance(高方差):也叫過擬合。模型過于復雜,把訓練數據中的一些偶然的特征也學習了進去,導致在訓練集上表現非常好,幾乎能完美擬合訓練數據,但在新數據上表現很差,泛化能力弱。圖中曲線過度地圍繞著數據點,甚至把一些可能是誤差的數據點也考慮進去了,雖然在訓練集上誤差極小,但在新數據上難以有好的表現。

在二維中可以直接可視化偏差和方差。但是在更多維中描述較為困難,使用幾個指標來描述偏差和方差。
在這里插入圖片描述
識別一張貓的圖片,假設人的識別率是0%的錯誤。

  • 在訓練集和測試集上錯誤率分別為1%和11%:說明模型對訓練集過擬合,對新的數據表現較差,稱為高方差。
  • 在訓練集和測試集上錯誤率分別為15%和16%:說明模型對訓練集欠擬合,對新的數據表現也較差,稱為高偏差。
  • 在訓練集和測試集上錯誤率分別為15%和30%:說明模型對訓練集欠擬合,但是對新的數據表現更差,稱為高偏差和高方差。
  • 在訓練集和測試集上錯誤率分別為0.5%和1%:說明模型對訓練集和新的數據表現均較好,稱為低偏差和低方差。

在這里插入圖片描述

圖中訓練集的紫色部分表現為高方差和高偏差。兩邊部分幾乎是一條直線,欠擬合,表現為高偏差,但是中間部分很靈活,對一些可能的錯誤點過擬合,(在新的數據上表現較差)表現為高方差。

對于高偏差的問題,嘗試選擇一個新的網絡、花費更多時間去訓練或者嘗試更先進的優化算法,一直到解決這個問題。當偏差降低到可以接受的范圍時,查看驗證集性能,檢查方差是否有問題。若方差較高,需要更多的數據去驗證或尋找更合適的神經網絡,但是有的時候并不能找到更多的數據的時候,可以采用正則化來減少過擬合。做到具體問題具體分析,比如算法存在高偏差的問題,采用更多的數據去訓練作用則效果不大。

在這里插入圖片描述

正則化

正則化參數

在模型的損失函數中添加一個懲罰項,對模型的參數進行約束。

以線性回歸模型為例,其原始損失函數為 L ( w , b ) = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2 L(w,b)=n1?i=1n?(yi??y^?i?)2,添加正則化項后變為 L ( w , b ) = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 + λ 2 m R ( w ) L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2+ \frac{\lambda}{2m} R(w) L(w,b)=n1?i=1n?(yi??y^?i?)2+2mλ?R(w)。其中 λ \lambda λ是正則化系數,用于控制正則化的強度。 2 m 2m 2m是樣本數量的2倍,數字2主要是為了求導的方便。 R ( w ) R(w) R(w)是正則化項,它對模型參數 w w w進行約束,使模型參數不會過大,避免模型過于復雜而出現過擬合。

正則化項取 R ( w ) = ∑ j = 1 m w j 2 = w T w R(w)=\sum_{j=1}^{m}w_{j}^{2}=w^Tw R(w)=j=1m?wj2?=wTw稱為L2正則化(嶺回歸),對模型參數的平方求和。L2正則化使得 參數趨于較小的值,但不會使參數變為0,通過減小參數的量級來降低模型的復雜度,防止過擬合。

L2距離(歐幾里得距離)

  • 在二維空間中:假設有兩個點 P ( x 1 , y 1 ) P(x_1,y_1) P(x1?,y1?) Q ( x 2 , y 2 ) Q(x_2,y_2) Q(x2?,y2?),它們之間的L2距離 d ( P , Q ) d(P,Q) d(P,Q)計算公式為 d ( P , Q ) = ( x 2 ? x 1 ) 2 + ( y 2 ? y 1 ) 2 d(P,Q)=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2} d(P,Q)=(x2??x1?)2+(y2??y1?)2 ? 。幾何意義是兩點之間直線段的長度。
  • 在n 維空間中:對于兩個 n 維向量 x = ( x 1 , x 2 , ? , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1?,x2?,?,xn?) y = ( y 1 , y 2 , ? , y n ) \mathbf{y}=(y_1,y_2,\cdots,y_n) y=(y1?,y2?,?,yn?),它們之間的L2距離 d ( x , y ) d(\mathbf{x},\mathbf{y}) d(x,y)的計算公式為 d ( x , y ) = ∑ i = 1 n ( y i ? x i ) 2 d(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i = 1}^{n}(y_i - x_i)^2} d(x,y)=i=1n?(yi??xi?)2 ?

正則化系數 λ \lambda λ是一個超參數,需要通過驗證集等方法進行調整。 λ \lambda λ值過小,正則化效果不明顯,無法有效防止過擬合; λ \lambda λ值過大,會過度約束模型參數,導致模型過于簡單,出現欠擬合。采用交叉驗證等方法,在不同的 λ \lambda λ取值下訓練模型并在驗證集上評估性能指標,選擇使驗證集性能最優的 λ \lambda λ值。

反向傳播的時候,不要忘記對懲罰項的求導。
d w = ( 原損失函數求導的結果 ) + λ m w [ l ] \mathbf{d}w=(原損失函數求導的結果) + \frac{\lambda}{m}w^{[l]} dw=(原損失函數求導的結果)+mλ?w[l] w [ l ] : = w [ l ] ? α d w [ l ] w^{[l]}:=w^{[l]}-\alpha\mathbf{d}w^{[l]} w[l]:=w[l]?αdw[l]

為什么正則化可以減少過擬合

在這里插入圖片描述
對于該損失函數,若 λ \lambda λ足夠大,求導后的 d w \mathbf{d}w dw也大,導致梯度下降的 w w w更小,當接近于0時,相當于將神經網絡的多個隱藏單元權重設置為0,整個大的神經網絡簡化成一個小的神經網絡,導致網絡欠擬合,更接近于高偏差的神經網絡。在調整 λ \lambda λ的過程中,總有個值讓神經網絡適度擬合。

實際上不是隱藏單元消失了,而是其權重變的更小。
在這里插入圖片描述

Dropout正則化

在這里插入圖片描述
對于左邊的過擬合的神經網絡,采用Dropout正則化,在模型訓練過程中,Dropout以一定的概率隨機 丟棄(設置為 0)神經網絡中隱藏層和輸入層的一些神經元。右圖中,假設有遍歷每一層的神經元,假設每個神經元有50%的概率被丟棄。

Inverted Dropout

在普通Dropout中,訓練時以概率 p p p隨機將神經元的輸出設置為0,測試時所有神經元都正常工作,這就導致訓練和測試階段網絡的行為存在差異,測試時需要對網絡輸出進行額外的縮放調整來匹配訓練時的預期輸出。

反向隨機失活(Inverted Dropout)在訓練階段對激活值進行縮放補償,使測試階段無需額外調整。具體做法是:在訓練時,對于每個神經元,以概率 p p p將其輸出設置為0,同時將保留(未被丟棄)的神經元輸出除以 1 ? p 1 - p 1?p 。這樣做的效果是,訓練階段神經元輸出的期望值與測試階段所有神經元都正常工作時的期望值保持一致。

假設一個神經元在未應用Dropout時的輸出為 x x x ,Dropout概率為 p = 0.5 p = 0.5 p=0.5

  • 普通Dropout訓練:該神經元有 0.5 0.5 0.5的概率輸出為0, 0.5 0.5 0.5的概率輸出為 x x x,其輸出的期望值為 0.5 × 0 + 0.5 × x = 0.5 x 0.5\times0 + 0.5\times x = 0.5x 0.5×0+0.5×x=0.5x 。測試時,所有神經元正常工作,輸出為 x x x ,因此測試時需要將訓練階段的輸出乘以2來匹配測試時的輸出。
  • inverted dropout訓練:該神經元有 0.5 0.5 0.5的概率輸出為0, 0.5 0.5 0.5的概率輸出為 x 1 ? 0.5 = 2 x \frac{x}{1 - 0.5}=2x 1?0.5x?=2x ,其輸出的期望值為 0.5 × 0 + 0.5 × 2 x = x 0.5\times0 + 0.5\times2x = x 0.5×0+0.5×2x=x 。測試時,所有神經元正常工作,輸出同樣為 x x x ,無需額外調整。

每一層的概率(keep-prob)可以設置為不同的值,1表示全部保留。如果擔心某些層比其他層更容易發生擬合,可以將該層的keep-prob設置的比其他層更低,但這樣做缺點是需要使用交叉驗證搜尋更多的超參數。

Dropout正則化的缺點是損失函數 J J J不再有明確的定義,從而不能很好地繪制損失函數圖像。

其他的正則化方法

數據增廣

如果想要通過擴增訓練數據來解決過擬合問題,但是擴增數據代價較高,這個時候,可以在原有的數據集上添加改變后的數據集來增加訓練集(數據增廣)。比如對圖片進行反轉或者裁剪;對文字旋轉或者變形。

在這里插入圖片描述

Early stopping

在模型訓練過程中,模型在訓練集上的損失通常會不斷降低,而在驗證集上的損失會先下降,到達某一時刻后可能開始上升,這表明模型開始過擬合訓練數據。Early stopping 會在訓練過程中持續監控驗證集上的性能指標,當驗證集上的性能指標出現過擬合時,就停止訓練。
在這里插入圖片描述

Early stopping提前停止訓練可能導致模型沒有充分學習到數據中的所有有用信息,沒有達到全局最優解,使得模型性能未達到理論上的最佳狀態。

歸一化

  • 第一步,零均值化 μ = 1 m ∑ i = 1 m x ( i ) , x : = x ? μ \mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)},\ x:=x-\mu μ=m1?i=1m?x(i),?x:=x?μ。將數據的均值調整為 0 。有助于使數據在特征空間中分布更加對稱,減少數據的偏置影響。
  • 第二步,方差歸一化 σ 2 = 1 m ∑ i = 1 m x ( i ) 2 , x / = σ 2 \sigma^2=\frac{1}{m}\sum_{i=1}^{m}x^{(i)^{2}},\ x/=\sigma^2 σ2=m1?i=1m?x(i)2,?x/=σ2。調整數據的方差,使不同特征的方差保持一致。如果不同特征的方差差異較大,那么方差大的特征可能會在模型訓練中占據主導地位,而方差小的特征的作用可能被忽視。
    在這里插入圖片描述

如果沒有歸一化,損失函數圖像像一個狹長的碗,在這樣的圖上運行梯度下降法,在更新參數時步伐不一致,可能導致在某些方向上過度更新,而在其他方向上更新不足,為了照顧不同的方向,學習率需設置的較小,從而需要更多的迭代次數才能收斂到最優解,增加了訓練時間和計算成本;歸一化使得損失函數更加對稱,算法可以更有效地調整參數,學習率可以設置的更大,花費更低的成本達到最優解。

在這里插入圖片描述

梯度消失與梯度爆炸

  • 梯度消失:在深度神經網絡的反向傳播過程中,梯度值隨著網絡層數的增加而逐漸變小,趨近于零。使得網絡中靠近輸入層的神經元的參數更新非常緩慢,甚至幾乎不更新,導致模型無法學習到足夠的信息,難以收斂到最優解。
  • 梯度爆炸:與梯度消失相反,在反向傳播過程中,梯度值隨著網絡層數的增加而變得越來越大,導致參數更新步長過大,使得模型無法穩定收斂,甚至可能導致參數值變為NaN(非數值)。

產生原因

  • 激活函數選擇:如果使用Sigmoid或Tanh等激活函數,它們的導數取值范圍是有限的,Sigmoid函數的導數在輸入值較大或較小時趨近于0。在深度網絡中,經過多層的鏈式求導后,梯度會不斷相乘,導致梯度值變得極小,從而引發梯度消失問題。
  • 網絡層數過深:隨著網絡層數的增加,反向傳播時梯度需要經過多次乘法運算,這使得梯度值容易出現指數級的衰減(梯度消失)或增長(梯度爆炸)。
  • 參數初始化不當:如果初始參數設置過大,在反向傳播過程中可能會導致梯度爆炸;如果初始參數設置過小,則可能加劇梯度消失問題。

權重初始化

He初始化

當使用ReLU激活函數時,傳統的初始化方法(如隨機初始化)可能會導致某些神經元在訓練初期就處于“死亡”狀態(即輸入小于0,輸出恒為0),或者使得梯度在反向傳播過程中迅速消失或爆炸。

He初始化是根據輸入層的神經元數量來調整初始化參數的方差,使得每一層的輸出方差在正向傳播過程中保持大致不變,同時在反向傳播時梯度的方差也能保持穩定,從而避免梯度消失和梯度爆炸問題,加速模型的收斂。

對于一個具有 n i n p u t (簡寫為 n i n ) n_{input}(簡寫為n_{in}) ninput?(簡寫為nin?個輸入神經元的全連接層,其權重參數 W W W的每個元素 w i j w_{ij} wij?按照以下方式進行初始化:

  • 從均值為0,標準差為 σ = 2 n i n \sigma = \sqrt{\frac{2}{n_{in}}} σ=nin?2? ?的正態分布中隨機采樣得到,即 w i j ~ N ( 0 , 2 n i n ) w_{ij} \sim N(0, \frac{2}{n_{in}}) wij?N(0,nin?2?)
  • 也可以從均勻分布 U ( ? 6 n i n , 6 n i n ) U(-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}) U(?nin?6? ?,nin?6? ?)中進行采樣。

對于卷積層, n i n n_{in} nin?表示輸入通道數乘以卷積核的高度和寬度。

Xavier初始化

對于一個具有 n i n n_{in} nin? 個輸入神經元和 n o u t n_{out} nout? 個輸出神經元的全連接層,其權重參數 W W W 的每個元素 w i j w_{ij} wij? 可以按照以下兩種方式進行初始化:

  • 正態分布初始化:從均值為 0,標準差為 σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin?+nout?2? ? 的正態分布中隨機采樣得到,即 w i j ~ N ( 0 , 2 n i n + n o u t ) w_{ij} \sim N(0, \frac{2}{n_{in} + n_{out}}) wij?N(0,nin?+nout?2?)
  • 均勻分布初始化:從均勻分布 U ( ? 6 n i n + n o u t , 6 n i n + n o u t ) U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}) U(?nin?+nout?6? ?,nin?+nout?6? ?) 中進行采樣。

Xavier初始化比較適用于使用Sigmoid、Tanh等傳統激活函數的神經網絡。

梯度檢驗

在實現復雜的神經網絡和反向傳播算法時,代碼中可能會出現各種錯誤,如索引錯誤、矩陣運算錯誤等。梯度檢驗可以幫助我們及時發現這些錯誤,確保反向傳播算法的實現是正確的。

梯度的數值逼近

由導數的定義可知。在微積分中,函數 f ( x ) f(x) f(x) 在某一點 x x x 處的導數可以用極限來近似表示:
f ′ ( x ) ≈ f ( x + ? ) ? f ( x ? ? ) 2 ? f'(x) \approx \frac{f(x + \epsilon)-f(x - \epsilon)}{2\epsilon} f(x)2?f(x+?)?f(x??)?
其中 ? \epsilon ? 是一個非常小的正數。

在神經網絡中,我們通過反向傳播算法計算損失函數 J ( θ ) J(\theta) J(θ) 關于參數 θ \theta θ 的導數 ? J ? θ \frac{\partial J}{\partial \theta} ?θ?J?,梯度檢驗就是將反向傳播計算得到的梯度與使用上述近似公式計算得到的梯度進行比較,如果兩者非常接近,則說明反向傳播算法的實現是正確的。
在這里插入圖片描述

g ( θ ) g(\theta) g(θ) f ( θ ) f(\theta) f(θ)的導數。

可以看出誤差是0.0001,不是很大,說明該代碼是正確的。

步驟(如上圖)

  1. 定義損失函數和參數:明確神經網絡的損失函數 J ( θ ) J(\theta) J(θ) 以及需要更新的參數 θ \theta θ
  2. 初始化參數:給參數 θ \theta θ 賦予初始值。
  3. 使用反向傳播計算梯度:通過反向傳播算法計算損失函數 J ( θ ) J(\theta) J(θ) 關于參數 θ \theta θ 的梯度 ? θ J \nabla_{\theta}J ?θ?J(對損失函數求某個參數的導數)。
  4. 使用數值近似計算梯度:對于參數 θ \theta θ 中的每一個元素 θ i \theta_i θi?,分別計算 J ( θ 1 , ? , θ i + ? , ? , θ n ) J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n) J(θ1?,?,θi?+?,?,θn?) J ( θ 1 , ? , θ i ? ? , ? , θ n ) J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n) J(θ1?,?,θi???,?,θn?),然后使用近似公式 ? J ? θ i ≈ J ( θ 1 , ? , θ i + ? , ? , θ n ) ? J ( θ 1 , ? , θ i ? ? , ? , θ n ) 2 ? \frac{\partial J}{\partial \theta_i} \approx \frac{J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n)-J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n)}{2\epsilon} ?θi??J?2?J(θ1?,?,θi?+?,?,θn?)?J(θ1?,?,θi???,?,θn?)? 計算梯度的近似值。
  5. 比較兩種梯度:計算反向傳播得到的梯度 ? θ J \nabla_{\theta}J ?θ?J 和數值近似得到的梯度之間的差異,通常使用相對誤差來衡量:
    d = ∥ ? θ J ? ? θ J a p p r o x ∥ 2 ∥ ? θ J ∥ 2 + ∥ ? θ J a p p r o x ∥ 2 d = \frac{\|\nabla_{\theta}J - \nabla_{\theta}J_{approx}\|_2}{\|\nabla_{\theta}J\|_2 + \|\nabla_{\theta}J_{approx}\|_2} d=?θ?J2?+?θ?Japprox?2??θ?J??θ?Japprox?2??
    其中 ∥ ? ∥ 2 \|\cdot\|_2 ?2? 表示向量的 L2 范數(L2距離)。如果相對誤差 d d d 非常小(例如小于 1 0 ? 7 10^{-7} 10?7),則說明反向傳播算法的實現是正確的;否則,可能存在代碼實現錯誤。

一些建議

  • 梯度檢驗僅用于調試,不能訓練過程中使用。
  • 若算法未能通過梯度檢驗,檢查各個值,比如如 d z \mathbf{d}z dz d w \mathbf{d}w dw d a \mathbf{d}a da,大概定位。
  • 進行梯度檢驗時要考慮正則化項。
  • 梯度檢驗不適用于帶有隨機失活(Dropout)的情況。
  • 剛開始的時候初始化的W和b都很小,趨于0,而模型可能在W和b小的時候可以很好的計算梯度,但是當迭代了一段時間后,W和b變大,模型可能會在這一部分存在問題,因此這個時候在開啟梯度檢驗比較合適。

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

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

相關文章

20【變量的深度理解】

一說起變量,懂點編程的都知道,但是在理解上可能還不夠深 變量就是存儲空間,電腦上的存儲空間有永久(硬盤)和臨時(內存條)兩種,永久數據重啟電腦后依舊存在,臨時數據只…

RESTful API的設計原則與這些原則在Java中的應用

RESTful API 是基于 REST(Representational State Transfer) 架構風格設計的 API,其核心目標是提高系統的可伸縮性、簡潔性和可維護性。以下是 RESTful API 的設計原則及在 Java 中的實現方法: 一、RESTful API 的核心設計原則 客…

【apt源】RK3588 平臺ubuntu20.04更換apt源

RK3588芯片使用的是aarch64架構,因此在Ubuntu 20.04上更換apt源時需要使用針對aarch64架構的源地址。以下是針對RK3588芯片在Ubuntu 20.04上更換apt源到清華源的正確步驟: 步驟一:打開終端 在Ubuntu 20.04中,按下Ctrl Alt T打…

k8s二進制集群之Kube ApiServer部署

創建kube工作目錄(僅在主節點上創建即可)同樣在我們的部署主機上創建apiserver證書請求文件根據證書文件生成apiserver證書僅接著創建TLS所需要的TOKEN創建apiserver服務的配置文件(僅在主節點上創建即可)創建apiserver服務管理配置文件對所有master節點分發證書 & TOK…

基于RK3588/RK3576+MCU STM32+AI的儲能電站電池簇管理系統設計與實現

伴隨近年來新型儲能技術的高質量規模化發展,儲能電站作為新能源領域的重要載體, 旨在配合逐步邁進智能電網時代,滿足電力系統能源結構與分布的創新升級,給予相應規模 電池管理系統的設計與實現以新的挑戰。同時,電子系…

K8s 分布式存儲后端(K8s Distributed Storage Backend)

K8s 分布式存儲后端 在 K8s 中實現分布式存儲后端對于管理跨集群的持久數據、確保高可用性、可擴展性和可靠性至關重要。在 K8s 環境中,應用程序通常被容器化并跨多個節點部署。雖然 K8s 可以有效處理無狀態應用程序,但有狀態應用程序需要持久存儲來維護…

FFmpeg:多媒體處理的瑞士軍刀

FFmpeg:多媒體處理的瑞士軍刀 前言 FFmpeg 是一個功能強大且跨平臺的開源多媒體框架,廣泛應用于音視頻處理領域。 它由多個庫和工具組成,能夠處理各種音視頻格式,涵蓋編碼、解碼、轉碼、流處理等多種操作。 無論是專業視頻編輯…

unordered_map/set的哈希封裝

【C筆記】unordered_map/set的哈希封裝 🔥個人主頁:大白的編程日記 🔥專欄:C筆記 文章目錄 【C筆記】unordered_map/set的哈希封裝前言一. 源碼及框架分析二.迭代器三.operator[]四.使用哈希表封裝unordered_map/set后言 前言 哈…

編程AI深度實戰:大模型哪個好? Mistral vs Qwen vs Deepseek vs Llama

?? 系列文章: 編程AI深度實戰:私有模型deep seek r1,必會ollama-CSDN博客 編程AI深度實戰:自己的AI,必會LangChain-CSDN博客 編程AI深度實戰:給vim裝上AI-CSDN博客 編程AI深度實戰:火的編…

neo4j-community-5.26.0 install in window10

在住處電腦重新配置一下neo4j, 1.先至官方下載 Neo4j Desktop Download | Free Graph Database Download Neo4j Deployment Center - Graph Database & Analytics 2.配置java jdk jdk 21 官網下載 Java Downloads | Oracle 中國 path: 4.查看java -version 版本 5.n…

【怎么用系列】短視頻戒除—1—對推薦算法進行干擾

如今推薦算法已經滲透到人們生活的方方面面,尤其是抖音等短視頻核心就是推薦算法。 【短視頻的危害】 1> 會讓人變笨,慢慢讓人喪失注意力與專注力 2> 讓人喪失閱讀長文的能力 3> 讓人沉浸在一個又一個快感與嗨點當中。當我們刷短視頻時&#x…

網絡原理(5)—— 數據鏈路層詳解

目錄 一. 以太網 1.1 認識以太網 1.2 網卡與以太網 1.3 以太網幀格式 二. 認識MAC地址 三. MAC地址 與 IP地址 的區別 4.1 定義 4.2 分配方式 4.3 工作層次 4.4 地址格式 4.5 尋址方式 四. ARP協議 4.1 引入 4.2 ARP的概念 4.3 ARP工作原理 五. MTU 與 MSS …

【從零開始的LeetCode-算法】922. 按奇偶排序數組 II

給定一個非負整數數組 nums, nums 中一半整數是 奇數 ,一半整數是 偶數 。 對數組進行排序,以便當 nums[i] 為奇數時,i 也是 奇數 ;當 nums[i] 為偶數時, i 也是 偶數 。 你可以返回 任何滿足上述條件的…

設計一個特殊token以從1億詞表中動態采樣8192個詞來表達當前序列

為了設計一個特殊token以從1億詞表中動態采樣8192個詞來表達當前序列,可以采用以下分步方案: 1. 特殊token的設計與作用 定義特殊token:在輸入序列前添加一個特殊標記,如[SUBVOCAB]。該token的嵌入包含觸發子詞表采樣的元信息。…

兩晉南北朝 僑置州郡由來

僑置的核心思想是面向人管理 而不是面向土地 1. 北雍州 西晉于長安置雍州,永嘉之亂,沒于劉、石。苻秦之亂,雍州流民南出樊沔,孝武于襄陽僑立雍州。此時稱長安為北雍州。

H264原始碼流格式分析

1.H264碼流結構組成 H.264裸碼流(Raw Bitstream)數據主要由一系列的NALU(網絡抽象層單元)組成。每個NALU包含一個NAL頭和一個RBSP(原始字節序列載荷)。 1.1 H.264碼流層次 H.264碼流的結構可以分為兩個層…

【C語言設計模式學習筆記1】面向接口編程/簡單工廠模式/多態

面向接口編程可以提供更高級的抽象,實現的時候,外部不需要知道內部的具體實現,最簡單的是使用簡單工廠模式來進行實現,比如一個Sensor具有多種表示形式,這時候可以在給Sensor結構體添加一個enum類型的type,…

AI大模型(二)基于Deepseek搭建本地可視化交互UI

AI大模型(二)基于Deepseek搭建本地可視化交互UI DeepSeek開源大模型在榜單上以黑馬之姿橫掃多項評測,其社區熱度指數暴漲、一躍成為近期內影響力最高的話題,這個來自中國團隊的模型向世界證明:讓每個普通人都能擁有媲…

C++基礎系列【2】C++基本語法

本文作為入門文檔&#xff0c;簡要介紹C的非常基本的語法&#xff0c;后面章節會詳細介紹C的各個語法。 C 程序結構 C程序的基本結構包括頭文件、命名空間、類和函數等。 下面我們通過Hello&#xff0c;World來展示這些元素。 #include <iostream> // 包含標準輸入輸…

【C語言】球球大作戰游戲

目錄 1. 前期準備 2. 玩家操作 3. 生成地圖 4. 敵人移動 5. 吃掉小球 6. 完整代碼 1. 前期準備 游戲設定:小球的位置、小球的半徑、以及小球的顏色 這里我們可以用一個結構體數組來存放這些要素,以方便初始化小球的信息。 struct Ball {int x;int y;float r;DWORD c…