主頁 >  其他 > 自己動手實作深度學習框架-5 使用學習率優化器加快模型訓練速度

自己動手實作深度學習框架-5 使用學習率優化器加快模型訓練速度

2020-09-14 10:42:15 其他

代碼倉庫: https://github.com/brandonlyg/cute-dl
(轉載請注明出處!)

目標

  1. 增加學習率優化器, 加快模型在小學習率下模型的訓練速度,
  2. 使用MNIST資料集比較同一個模型使用不同學習率優化器的表現,

常見的學習率優化演算法

在上個階段,我們使用固定學習率優化器訓練識別MNIST手寫數字模型,在后面的示例中將會看到: 如果學習習設定太大,模型將無法收斂; 如果設定學習率太小模型大概率會收斂速度會非常緩慢,因此必須要要給學習率設定一個合適的值,這個合適的值到底是什么需要反復試驗,
訓練模型的本質是,在由損失函式定義的高緯超平面中盡可能地找到最低點,由于高緯超平面十分復雜,找到全域最低點往往不現實,因此找到一個盡量接近全域最低點的區域最低點也是可以的,
由于模型引數是隨機初始化的,在訓練的初始階段, 可能遠離最低點,也可能距最低點較較近,為了使模型能夠收斂,較小的學習率比較大的學習率更有可能達到目地, 至少不會使模型發散,
理想的狀態下,我們希望,學習率是動態的: 在遠離最低點的時候有較大的學習率,在靠近最低點的時候有較小的學習率,
學習率演算法在訓練程序中動態調整學習率,試圖使學習率接近理想狀態,常見的學習率優化演算法有:

  • 動量演算法,
  • Adagrad演算法,
  • RMSProp演算法,
  • Adadelta演算法,
  • Adam演算法,

目前沒有一種理論能夠給出定量的結論斷言一種演算法比另一種更好,具體選用哪種演算法視具體情況而定,
接下來將會詳細討論每種演算法的數學性質及實作,為了方便討論,先給出一些統一的定義:

  • 模型經歷一次向前傳播和一次反向傳播稱訓練稱為一次迭代,用t表示模型當前的迭代次數,t=0,1,2,..., 當t=0是表示模型處于初始狀態,
  • g表示反向傳播的梯度, \(g_t\)是第t次迭的梯度,其他量的表示方式和g相同,
  • w表示模型學習的引數,α表示學習率超引數,
  • 符號a ⊙ v如果a和v都是向量, a, v必須有相同的維度a ⊙ v表示他們相同位置上的元素相乘,結果是和a,v具有相同維度的向量. 如果a是標量v是向量a ⊙ v表示向量的標量乘法等價于av,

動量演算法

數學原理

\[\begin{matrix} v_t = v_{t-1}γ + αg_t \\ w = w - v_t\\ \end{matrix} \]

其中v是動量\(v_0=0\), γ是動量的衰減率\(γ∈(0,1)\). 現在把\(v_t\)展開看一下\(g_i, i=1,2,...t\)對v_t的影響.

\[v_t = α(γ^{t-1}g_1 + γ^{t-2}g_2 + ... + γg_{t-1} + g_t) \]

個項系數之和的極限情況:

\[\lim_{t \to ∞} \sum_{i=1}^t γ^{t-i} = \frac{1}{1-γ} \]

\(t=\frac{1}{1-γ}\)則有\(\frac{1}{t}=1-γ\), \(g_i\)的指數加權平均值可用下式表示:

\[\bar v_t = \frac{1}{t}(γ^{t-1}g_1 + γ^{t-2}g_2 + ... + γg_{t-1} + g_t) = (1-γ)(γ^{t-1}g_1 + γ^{t-2}g_2 + ... + γg_{t-1} + g_t) \]

如果把學習率α表示為:\(α=\frac{α}{1-γ}(1-γ)\),因此\(v_t\)可以看成是最近的\(1-γ\)次迭代梯度的指數加權平均乘以一個縮放量\(\frac{α}{1-γ}\), 這里的縮放量\(\frac{α}{1-γ}\)才是真正的學習率引數,
\(\frac{1}{1-γ}=n\), 最近n次迭代梯度的權重占總權重的比例為:

\[(\sum_{i=1}^{n} γ^i) / \frac{1}{1-γ} = \frac{\frac{1-γ^n}{1-γ}}{\frac{1}{1-γ}} = 1-γ^n = 1 - γ^{\frac{1}{1-γ}} \]

當γ=0.9時, \(1 - γ^{10}≈0.651\), 就是說, 這個時候, 最近的10次迭代占總權重的比例約為65.1%, 換言之\(v_t\)的值的數量級由最近10次迭代權重值決定,
當我們設定超引數γ,α時, 可以認為取了最近\(\frac{1}{1-γ}\)次迭代梯度的指數加權平均值為動量積累量,然后對這個積累量作\(\frac{α}{1-γ}\)倍的縮放, 例如: γ=0.9, α=0.01, 表示取最近10次的加權平均值,然后將這個值縮小到原來的0.1倍,
動量演算法能夠有效地緩解\(g_t \to 0\)時引數更新緩慢的問題和當\(g_t\)很大時引數更新幅度過大的問題,
比較原始的梯度下降演算法和使用動量的梯度下降演算法更新引數的情況:

\[\begin{matrix} w = w - αg_t & (1) & 原始梯度下降演算法 \\ w = w - v_t & (2) & 動量演算法 \end{matrix} \]

\(g_t \to 0\)時, 有3種可能:

  1. 當前位置是超平面的一個全域最低點,是期望的理想收斂位置,(1)式會停止更新引數, (2)式會使引數在這個位置周圍以越來越小的幅度震蕩, 最終收斂到這個位置,
  2. 當前位置是超平面的一個區域最低點,(1)式會停留在這個位置, 最終學習到一個不理想的引數,(2)式中\(v_t\)由于積累了最近n步的勢能, 會沖過這個區域, 繼續尋找更優解,
  3. 當前位置是超平面的一個鞍點, (1)式會停留在這個位置, 最終學習到一個不可用的引數,(2)式中\(v_t\)由于記錄了最近n步的勢能, 會沖過這個區域, 繼續尋找更優解

\(g_t\)很大時(1)式導致引數大幅度的更新, 會大概率導致模型發散,(2)式當γ=0.9時, \(g_t\)\(v_t\)的影響權重是0.1; 式當γ=0.99時,\(g_t\)\(v_t\)的影響權重是0.01, 相比于\(g_{t-1}\)\(g_t\)的增加幅度, \(v_{t-1}\)\(v_t\)增加幅度要小的多, 引數更新也會平滑許多,

實作

檔案: cutedl/optimizers.py, 類名:Momentum.

  def update_param(self, param):
      #pdb.set_trace()
      if not hasattr(param, 'momentum'):
          #為引數添加動量屬性
          param.momentum = np.zeros(param.value.shape)

      param.momentum = param.momentum * self.__dpr + param.gradient * self.__lr

      param.value -= param.momentum

Adagrad演算法

數學原理

\[\begin{matrix} s_t = s_{t-1} + g_t ⊙ g_t \\ Δw_t = \frac{α}{\sqrt{s_t} + ε} ⊙ g_t \\ w = w - Δw_t \end{matrix} \]

其中\(s_t\)是梯度平方的積累量, \(ε=10^{-6}\)用來保持數值的穩定, Δw_t是引數的變化量,\(s_t\)的每個元素都是正數, 隨著迭代次數增加, 數值會越來越大,相應地\(\frac{α}{\sqrt{s_t} + ε}\)的值會越來越小,\(\frac{α}{\sqrt{s_t} + ε}\)相當于為\(g_t\)中的每個元素計算獨立的的學習率, 使\(Δw_t\)中的每個元素位于(-1, 1)區間內,隨著訓練次數的增加會向0收斂,這意味著\(||Δw_t||\)會越來越小, 迭代次數比較大時, \(||Δw_t|| \to 0\), 引數w將不會有更新,相比于動量演算法, Adagrad演算法調整學習率的方向比較單一, 只會往更小的方向上調整,α不能設定較大的值, 因為在訓練初期\(s_t\)的值會很小, \(\frac{α}{\sqrt{s_t} + ε}\)會放大α的值, 導致較大的學習率,從而導致模型發散,

實作

檔案: cutedl/optimizers.py, 類名:Adagrad.

  def update_param(self, param):
      #pdb.set_trace()
      if  not hasattr(param, 'adagrad'):
          #添加積累量屬性
          param.adagrad = np.zeros(param.value.shape)

      a = 1e-6
      param.adagrad += param.gradient ** 2
      grad = self.__lr/(np.sqrt(param.adagrad) + a) * param.gradient
      param.value -= grad

RMSProp演算法

數學原理

為了克服Adagrad積累量不斷增加導致學習率會趨近于0的缺陷, RMSProp演算法的設計在Adagrad的基礎上引入了動量思想,

\[\begin{matrix} s_t = s_{t-1}γ + g_t ⊙ g_t(1-γ) \\ Δw_t = \frac{α}{\sqrt{s_t} + ε} ⊙ g_t \\ w = w - Δw_t \end{matrix} \]

演算法設計者給出的推薦引數是γ=0.99, 即\(s_t\)是最近100次迭代梯度平方的積累量, 由于計算變化量時使用的是\(\sqrt{s_t}\), 對變化量的影響只相當于最近10次的梯度積累量,
的Adagrad類似, \(s_t\)\(g_t\)的方向影響較小, 但對\(||g_t||\)大小影響較大,會把它縮小到(-1, 1)區間內, 不同的是不會單調地把\(||g_t||\)收斂到0, 從而克服了Adagrad的缺陷,

實作

檔案: cutedl/optimizers.py, 類名:RMSProp.

  def update_param(self, param):
      #pdb.set_trace()
      if not hasattr(param, 'rmsprop_storeup'):
          #添加積累量屬性
          param.rmsprop_storeup = np.zeros(param.value.shape)

      a = 1e-6

      param.rmsprop_storeup = param.rmsprop_storeup * self.__sdpr + (param.gradient**2) * (1-self.__sdpr)
      grad = self.__lr/(np.sqrt(param.rmsprop_storeup) + a) * param.gradient

      param.value -= grad

Adadelta演算法

數學原理

這個演算法的最大特點是不需要全域學習率超引數, 它也引入了動量思想,使用變化量平方的積累量和梯度平方的積累量共同為\(g_t\)的每個元素計算獨立的學習率,

\[\begin{matrix} s_t = s_{t-1}γ + g_t ⊙ g_t(1-γ) \\ Δw_t = \frac{\sqrt{d_{t-1}} + ε}{\sqrt{s_t} + ε} ⊙ g_t \\ d_t = d_{t-1}γ + Δw_t ⊙ Δw_t(1-γ)\\ w = w - Δw_t \end{matrix} \]

這個演算法引入了新的量\(d_t\), 是變化量平方的積累量, 表示最近n次迭代的引數變化量平方的加權平均. \(ε=10^{-6}\). 推薦的超引數值是γ=0.99,這個演算法和RMSProp類似, 只是用\(\sqrt{d_{t-1}}\)代替了學習率超引數α,

實作

檔案: cutedl/optimizers.py, 類名:Adadelta.

  def update_param(self, param):
      #pdb.set_trace()
      if not hasattr(param, 'adadelta_storeup'):
          #添加積累量屬性
          param.adadelta_storeup = np.zeros(param.value.shape)

      if not hasattr(param, "adadelta_predelta"):
          #添加上步的變化量屬性
          param.adadelta_predelta = np.zeros(param.value.shape)

      a = 1e-6

      param.adadelta_storeup = param.adadelta_storeup * self.__dpr + (param.gradient**2)*(1-self.__dpr)
      grad = (np.sqrt(param.adadelta_predelta)+a)/(np.sqrt(param.adadelta_storeup)+a) * param.gradient
      param.adadelta_predelta = param.adadelta_predelta * self.__dpr + (grad**2)*(1-self.__dpr)

      param.value -= grad

Adam演算法

數學原理

前面討論的Adagrad, RMSProp和Adadetal演算法, 他們使用的加權平均積累量對\(g_t\)的范數影響較大, 對\(g_t\)的方向影響較小, 另外它們也不能緩解\(g_t \to 0\)的情況,Adam演算法同時引入梯度動量和梯度平方動量,理論上可以克服前面三種演算法共有的缺陷的缺陷,

\[\begin{matrix} v_t = v_{t-1}γ_1 + g_t(1-γ_1) \\ s_t = s_{t-1}γ_2 + g_t ⊙ g_t(1-γ_2) \\ \hat{v_t} = \frac{v_t}{1 - γ_1^t} \\ \hat{s_t} = \frac{s_t}{1 - γ_2^t} \\ Δw_t = \frac{α\hat{v_t}}{\sqrt{s_t} + ε} \\ w = w - Δw_t \end{matrix} \]

其中\(v_t\)和動量演算法中的\(v_t\)含義一樣,\(s_t\)和RMSProp演算法的\(s_t\)含義一樣, 對應的超引數也有一樣的推薦值\(γ_1=0.9\), \(γ_2=0.99\),用于穩定數值的\(ε=10^{-8}\). 比較特別的是\(\hat{v_t}\)\(\hat{s_t}\), 他們是對\(v_t\)\(s_t\)的一個修正,以\(\hat{v_t}\)為例, 當t比較小的時候, \(\hat{v_t}\)近似于最近\(\frac{1}{1-γ}\)次迭代梯度的加權和而不是加權平均, 當t比較大時, \(1-γ^t \to 1\), 從而使\(\hat{v_t} \to v_t\),也就是所\(\hat{v_t}\)時對對迭代次數較少時\(v_t\)值的修正, 防止在模型訓練的開始階段產生太小的學習率,\(\hat{s_t}\)的作用和\(\hat{v_t}\)是類似的,

實作

檔案: cutedl/optimizers.py, 類名:Adam.

  def update_param(self, param):
      #pdb.set_trace()
      if not hasattr(param, 'adam_momentum'):
          #添加動量屬性
          param.adam_momentum = np.zeros(param.value.shape)

      if not hasattr(param, 'adam_mdpr_t'):
          #mdpr的t次方
          param.adam_mdpr_t = 1

      if not hasattr(param, 'adam_storeup'):
          #添加積累量屬性
          param.adam_storeup = np.zeros(param.value.shape)

      if not hasattr(param, 'adam_sdpr_t'):
          #動量sdpr的t次方
          param.adam_sdpr_t = 1

      a = 1e-8
      #計算動量
      param.adam_momentum = param.adam_momentum * self.__mdpr + param.gradient * (1-self.__mdpr)
      #偏差修正
      param.adam_mdpr_t *= self.__mdpr
      momentum = param.adam_momentum/(1-param.adam_mdpr_t)

      #計算積累量
      param.adam_storeup = param.adam_storeup * self.__sdpr + (param.gradient**2) * (1-self.__sdpr)
      #偏差修正
      param.adam_sdpr_t *= self.__sdpr
      storeup = param.adam_storeup/(1-param.adam_sdpr_t)

      grad = self.__lr * momentum/(np.sqrt(storeup)+a)
      param.value -= grad

不同學習率對訓練模型的影響

接下來我們仍然使用上個階段的模型做為示例, 使用不同的優化演算法訓練模型,對比差別,代碼在examples/mlp/mnist-recognize.py中
代碼中有兩個結束訓練的條件:

  1. 連續20次驗證沒有得到更小的驗證誤差,表示模型模型已經無法進一步優化或者已經開始發散了,結束訓練,
  2. 連續20次驗證模型驗證正確率都在91%以上,表示模型性能已經達到預期目標且是收斂的,結束訓練,

不使用優化演算法的情況

使用較小的學習率

  def fit0():
    lr = 0.0001
    print("fit1 lr:", lr)
    fit('0.png', optimizers.Fixed(lr))


較小的固定學習率0.0001可以使模型穩定地收斂,但收斂速度很慢, 訓練接近100萬步, 最后由于收斂速度太慢而停止訓練,

使用較大的學習率

def fit1():
    lr = 0.2
    print("fit0 lr:", lr)
    fit('1.png', optimizers.Fixed(lr))


較大的固定學習率0.2, 模型在訓練7萬步左右的時候因發散而停止訓練,模型進度開始降低: 最大驗證正確率為:0.8445, 結束時的驗證正確率為:0.8438.

適當的學習率

def fit2():
    lr = 0.01
    print("fit2 lr:", lr)
    fit('2.png', optimizers.Fixed(lr))


通過多次試驗, 找到了一個合適的學習率0.01, 這時模型只需訓練28000步左右即可達到期望性能,

動量演算法優化器

def fit_use_momentum():
    lr = 0.002
    dpr = 0.9
    print("fit_use_momentum lr=%f, dpr:%f"%(lr, dpr))
    fit('momentum.png', optimizers.Momentum(lr, dpr))


這里的真實學習率為\(\frac{0.002}{1-0.9} = 0.02\),模型訓練23000步左右即可達到期望性能,這里的學習率稍大,證明動量演算法可以適應稍大學習率的數學性質,

Adagrad演算法優化器

def fit_use_adagrad():
    lr = 0.001
    print("fit_use_adagrad lr=%f"%lr)
    fit('adagrad.png', optimizers.Adagrad(lr))


多次試驗表明,Adagrad演算法的引數最不好調,由于這個演算法的學習率會一直單調遞減, 它只能對模型進行小幅度的優化, 故而這個演算法并不適合從頭開始訓練模型,比較適合對預訓練的模型引數進行微調,

RMSProp演算法優化器

def fit_use_rmsprop():
    sdpr = 0.99
    lr=0.0001
    print("fit_use_rmsprop lr=%f sdpr=%f"%(lr, sdpr))
    fit('rmsprop.png', optimizers.RMSProp(lr, sdpr))


這里給出的是較小的學習率0.0001,多次試驗表明, RMSProp在較大學習率下很容易發散,而在較小學習率下通常會有穩定的良好表現,

Adadelta演算法優化器

def fit_use_adadelta():
    dpr = 0.99
    print("fit_use_adadelta dpr=%f"%dpr)
    fit('adadelta.png', optimizers.Adadelta(dpr))


這個演算法不需要給出學習率引數,多次試驗顯示, 在這個簡單模型上, Adadelta演算法表現得非常穩定,

Adam演算法優化器

def fit_use_adam():
    lr = 0.0001
    mdpr = 0.9
    sdpr = 0.99
    print("fit_use_adam lr=%f, mdpr=%f, sdpr=%f"%(lr, mdpr, sdpr))
    fit('adam.png', optimizers.Adam(lr, mdpr, sdpr))


只用這個演算法在較小學習率0.0001的情況下20000步左右即可完成訓練且最終達到了92.4%的驗證準確率,

總結

這個階段為框架添加了常見的學習率優化演算法,并在同一個模型上進行驗證,對比,我發現即使不使用優化演算法,用固定的學習率, 只要給出“合適”的學習率引數,仍然能夠得到理想的訓練速度, 但很難確定怎樣才算“適合”, 學習率演算法給出了引數調整的大致方向,一般來說較小的學習率都不會有問題,至少不會使模型發散,然后可以通過調整衰減率來加快訓練速度,而衰減率有比較簡單數學性質可以讓我們在調整它的時知道這樣調整意味著什么,
目前為止cute-dl框架已經實作了對簡單MLP模型的全面支持,接下來將會為框架添一些層,讓它能夠支持卷積神經網路模型,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/34007.html

標籤:其他

上一篇:spark寫入phoenix

下一篇:Qt(python) + 百度語音合成 實作demo

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more