1. 全连接神经网络
人工神經網絡
目錄
- 一、神經元
- 1、感知機
- 2、激活函數
- 2.1 閾值函數
- 2.2 分段線性函數
- 2.3 Sigmoid函數
- 2.4 Tanh函數
- 2.5 ReLU 函數
- 2.6 SoftPlus
- 3、梯度下降法[^ 2]
- 4、感知機的原生實現[^ 2]
- 二、網絡結構[^ 3]
- 1、前饋網絡
- 2、記憶網絡
- 3、圖網絡
- 三、前饋網絡和反向傳播算法
- 1、代碼實現
- 1.1 回歸
- 1.2 分類
- 四、參考文獻
本文所有代碼均在 jupyter 環境下編譯通過,使用的框架包含 numpy 1.19.5, keras 2.5.0 sklearn 0.24.2 matplotlib 3.4.2
一、神經元
1、感知機
??深度學習模擬人腦神經網絡進行分析學習,人腦神經網絡由大量神經元構成,神經元接受突觸傳來的電位信號并整合這些信號,當信號總和達到閾值,神經元將產生興奮或者抑制。
符號表示:
xnx_nxn? :輸入信號
wijw_{ij}wij? :突觸權值(為正表示激活,為負表示抑制)
Σ\SigmaΣ? :一個求和單元,求取各輸入信號的加權和(線性組合)∑=∑iωiXi=ωTX\sum = \sum\limits_i{\omega_iX_i} = \omega^TX∑=i∑?ωi?Xi?=ωTX
θj\theta_jθj? :神經元固有偏置(閾值)
fff :非線性激活函數,起非線性映射作用并將神經元輸出幅度限制在一定范圍內(一般在(0, 1)或(-1, 1)之間)
ui=∑j=1pwijxjvi=ui?θjyi=f(vi)u_i = \sum\limits^p_{j=1} {w_{ij}x_j} \\ v_i = u_i - \theta_j \\ y_i = f(v_i) ui?=j=1∑p?wij?xj?vi?=ui??θj?yi?=f(vi?)
??若把輸入的維數增加一維,則可把閾值 θj\theta_jθj? 包括進去(有沒有感覺viv_ivi?的公式和最小二乘法一模一樣):
vi=∑j=0pwijxjyi=f(vi)v_i = \sum\limits^p_{j=0}w_{ij}x_j \\ y_i = f(v_i) vi?=j=0∑p?wij?xj?yi?=f(vi?)
??此處增加了一個新的連接,其輸出 x0=±1x_0 = \pm 1x0?=±1,權值 wi0=θkw_{i0} = \theta_kwi0?=θk??? ,偏置通過增加一個常數因子從而提供線性模型模擬直線族的能力。
??感知機的參數更新規則通過求解梯度得到,其中 η\etaη 用于調整感知機的學習率,以確定感知機錯誤時的學習幅度。參數 xix_ixi? 是對應的第 i 個學習樣本,而 Δyi\Delta y_iΔyi? 則是對應預測值與真實值的誤差,以二分類為例,預測正確時 Δy=0\Delta y = 0Δy=0,反之為1.
ω←ω+ηΔyixib←b+ηΔyi\omega \leftarrow \omega + \eta \Delta y_i x_i \\ b \leftarrow b + \eta \Delta y_i ω←ω+ηΔyi?xi?b←b+ηΔyi?
2、激活函數
??可參考深度學習中的激活函數[^ 1]
- 飽和激活函數:Sigmoid,Tanh
- 非飽和激活函數:ReLU,Leaky Relu, ELU,PReLU,RReLU
2.1 閾值函數
f(v)={1,v?≥00,v?<?0(1)f(v) = \begin{cases} 1, & \text{v $\ge$ 0} \\ 0, & \text{v < 0} \end{cases}\tag{1} f(v)={1,0,?v?≥?0v?<?0?(1)
即階梯函數,其中 vi=∑j=1pwijxj?θiv_i = \sum\limits^p_{j=1}w_{ij}x_j - \theta_ivi?=j=1∑p?wij?xj??θi? ,此種神經元為 M?PM-PM?P模型。
2.2 分段線性函數
f(v)={1,v≥11+v2,-1?<?v?<?10,v?≤-1(2)f(v) = \begin{cases} 1, & \text{v$\ge$1} \\ \frac{1 + v}{2}, & \text{-1 < v < 1} \\ 0, & \text{v $\le$ -1} \end{cases} \tag{2} f(v)=??????1,21+v?,0,?v≥1-1?<?v?<?1v?≤?-1?(2)
??類似于一個放大系數為1的分線性放大器,當工作于線性區時它是一個線性組合其,放大系數趨于無窮大時變成一個閾值單元。
2.3 Sigmoid函數
??SigmoidSigmoidSigmoid 函數具有良好的數學性質 —— 其導數值可以通過原函數求得,因此無需對 Sigmoid 進行顯示求導,另一方面,Sigmoid 函數值域為(0,1),因此對于輸入X 較大的情況能夠壓縮輸出到合理的范圍內,其定義為
Sigmoid(X)=11+e?XSigmoid(X) = \frac{1}{1+e^{-X}} Sigmoid(X)=1+e?X1?
??Sigmoid 函數圖像為
??可見,Sigmoid 在定義域內處處可導,且兩側導數逐漸趨近于0,即: lim?x→∞f′(x)=0\lim\limits_{x \to \infty}f'(x) = 0x→∞lim?f′(x)=0? ,這類性質的激活函數被定義為軟飽和激活函數。與軟飽和相對的是硬飽和激活函數,即:f′(x)=0,∣x∣>cf'(x) = 0, |x|>cf′(x)=0,∣x∣>c,c為常數。
??在后向傳遞過程中,Sigmoid 向下傳導的梯度包含了f′(x)f'(x)f′(x)因子( Sigmoid 關于輸入的導數),因此一旦落入飽和區,f′(x)→0f'(x) \to 0f′(x)→0? ,導致向底層傳遞的梯度也變得非常小,網絡參數很難得到有效訓練,這種被稱之為梯度消失(與之對應的是梯度爆炸),一般 Sigmoid 網絡在5層之內就會產生梯度消失現象。
??Sigmoid 的飽和性在物理意義上最接近生物神經元,(0,1)的輸出還可以被表示為概率,或用于輸入的歸一化,代表性的如 Sigmoid 交叉熵損失函數
2.4 Tanh函數
??Tanh 是雙曲正切函數,與 Sigmoid 函數相似,Tanh 函數值同樣有界,并且函數形狀十分類似,同樣能將實數域內的值壓縮到值域范圍內,Tanh 的值域為(-1, 1),Tanh 的函數定義為
Tanh(X)=eX?e?XeX+e?X=2Sigmoid(2x)?1Tanh(X) = \frac{e^X - e^{-X}}{e^X + e^{-X}} = 2 Sigmoid(2x)-1 Tanh(X)=eX+e?XeX?e?X?=2Sigmoid(2x)?1
??tanh 也具有軟飽和性,因為 tanh 的輸出均值比 Sigmoid 更接近0,SGD會更接近 natural gradient,從而降低所需的迭代次數。
2.5 ReLU 函數
??與傳統的 Sigmoid 函數相比,ReLU 能有效緩解梯度消失問題,又稱為線性修正單元
ReLU(X)=max(X,0)={Xif?X?>?00otherwiseReLU(X) = max(X, 0) = \begin{cases} X & \text{if $\;$X > 0} \\ 0 & \text{otherwise} \end{cases} ReLU(X)=max(X,0)={X0?if?X?>?0otherwise?
??ReLU 在 x<0x < 0x<0 時硬飽和,由于 x>0x > 0x>0 時導數為1, 所以 ReLU能夠在 x>0x > 0x>0? 時保持梯度不衰減,從而緩解梯度消失問題,但隨著訓練推進,部分輸入會落入硬飽和區,導致對應權重無法更新,這種現象被稱為神經元死亡。
2.6 SoftPlus
??SoftPlus 函數通過高斯變換,在0附近的拐點較為緩和
SoftPlus(X)=log(1+eX)SoftPlus(X) = log(1+e^X) SoftPlus(X)=log(1+eX)
3、梯度下降法[^ 2]
??一個剛剛初始化的神經網絡模型中,每個神經元的權重通常是隨機初始化的,因此預測的結果往往與數據的真實標簽有較大的偏差。
??在最開始的訓練過程中,每一輪(epoch)訓練的輸出中都會存在分類錯誤的樣本,錯誤的樣本為模型的訓練提供了依據,神經網絡模型會根據錯誤的信息修正網絡中的參數分布情況,從而較好的擬合真實數據集中的特征分布情況這種以輸出的誤差作為調整信息的信號源,由網絡的輸出層向網絡的輸入層逐層傳播信息的方法即為反向傳播法。
??模型預測值與數的真實標簽之間通過損失函數刻畫偏差。通過將每個樣本的預測誤差進行累加,就可以得到最終的總體誤差。以均方誤差的12\frac{1}{2}21?為例, loss=12∑i(yi?predicti)2predicti=F(Xi)loss = \frac{1}{2}\sum\limits_i(y_i - predict_i)^2 \qquad predict_i = F(X_i)loss=21?i∑?(yi??predicti?)2predicti?=F(Xi?)??
??通過梯度進行迭代試錯,減少損失。梯度下降法基于梯度因子,梯度就是沿著函數的各個維度進行求偏導得到的向量。梯度算子描述了函數上升最快的方向,因此,更新參數時,將會沿著梯度的反方向更新參數。
??以 Sigmoid 函數求導為例: S = Sigmoid
S(x)′=(11+e?x)′=e?x(1+e?x)2=(1+e?x)?1(1+e?x)2=11+e?x?1(1+e?x)2=11+e?x(1?11+e?x)=S(x)(1?S(x))S(x)' = (\frac{1}{1+e^{-x}})' = \frac{e^{-x}}{(1+e^{-x})^2} \\ =\frac{(1 + e^{-x}) -1}{(1 + e^{-x})^2}\\ = \frac{1}{1+e^{-x}} - \frac{1}{(1 + e^{-x})^2} \\ = \frac{1}{1 + e^{-x}}(1 - \frac{1}{1 + e^{-x}}) \\ = S(x)(1 - S(x)) S(x)′=(1+e?x1?)′=(1+e?x)2e?x?=(1+e?x)2(1+e?x)?1?=1+e?x1??(1+e?x)21?=1+e?x1?(1?1+e?x1?)=S(x)(1?S(x))
??在高維空間中,沿著各個軸方向分別求解偏導數所組成的向量即為梯度,調整參數的過程即為通過梯度的反方向結合步長,根據模型輸出的預測結果與實際值之間的誤差進行反饋調整:ω←ω?ηΔloss(ω)\omega \leftarrow \omega - \eta \Delta loss(\omega)ω←ω?ηΔloss(ω)
??對 losslossloss 進行求導,結合 Sigmoid 求導,可得線性單元中損失函數的梯度:
Δloss(ω)=?loss(ω)?ω=12∑i?(yi?F(xi))2?ω=∑i(yi?F(xi))?(?F(xi))?ω=?∑i(yi?F(xi))xi\Delta loss (\omega) = \frac{\partial loss(\omega)}{\partial \omega} \\ = \frac{1}{2} \sum\limits_{i} \frac{\partial(y_i -F(x_i))^2}{\partial \omega} \\ = \sum\limits_i (y_i - F(x_i))\frac{\partial(-F(x_i))}{\partial \omega} \\ = - \sum\limits_i (y_i - F(x_i))x_i Δloss(ω)=?ω?loss(ω)?=21?i∑??ω?(yi??F(xi?))2?=i∑?(yi??F(xi?))?ω?(?F(xi?))?=?i∑?(yi??F(xi?))xi?
??得到 ω←ω+η∑i(yi?F(xi))xi\omega \leftarrow \omega + \eta\sum\limits_i(y_i - F(x_i))x_iω←ω+ηi∑?(yi??F(xi?))xi?
4、感知機的原生實現[^ 2]
??常用的Python深度學習框架包括 Tensorflow, Pytorch, MXnet, Caffe, Keras等, 以下通過 numpy 實現一個簡易感知機進行與或非三種基本邏輯運算的代碼
import numpy as np# 激活函數 def activate(X):'''該激活函數為一個階躍函數Arg: X 輸入參數矩陣 XReturn: X: 激活后的值'''X[X > 0], X[X < 0] = 1, 0return X# 在參數矩陣中加入偏置項 bias def add_bias(X):'''Args: X: 輸入參數矩陣X'''if X.ndim == 1:X = X.reshape(len(X), 1)return np.hstack([X, np.ones((len(X), 1))])# 訓練感知機 def train(X, Y, eta=0.2):'''Args: X: 輸入參數矩陣Y: 指定標簽列表eta: 學習率,默認值設為0.2Return:omega: 權重向量與偏置項'''# 初始化權重向量,其中包含偏置項的權重omega = np.zeros(X.shape[1])# 開始權重訓練過程while True:# 計算樣本預測與標簽的誤差delta = Y - predict(omega, X)if (abs(delta) > 0).any():# 更新權重及偏置omega += eta * np.sum((delta * X.T).T, axis=0)else :return omega# 根據輸入參數預測結果 def predict(omega, X):'''Args:omega: 權重與偏置構成的矩陣X: 輸入參數矩陣Return:res: 預測結果'''return activate(omega.dot(X.T))# 將傳入的數據進行訓練, 并將數據打亂后進行測試 def train_and_evaluate(X, Y, X_test, Y_test, eta=0.1):'''Args:X: 輸入參數矩陣eta: 學習率'''# 加入偏置項biasX_bias = add_bias(X)# 執行訓練并返回參數omega = train(X_bias, Y, eta=eta)# 輸出訓練參數info = ''.join(['權重 %d: %.4f\n' % (i+1, w) for i, w in enumerate(omega[:-1])])info += + '偏置項: %.4f\n' % omega[-1]print(info)# 評估訓練結果X_test_bias = add_bias(X_test)Y_pred = predict(omega, X_test_bias)# 輸出測試標簽與預測結果print('True: Y = %s', Y_test)print('Predict: Y = %s', Y_pred)# 構造數據訓練集與測試集 def prepare_data(data_type = 'and'):'''Args:type: 構造的數據集類型,與或非'''data_type = data_type.lower()if data_type in ['and', 'or']:X = np.asarray([[1, 1],[1, 0],[0, 1],[0, 0]])Y = np.asarray([1, 0, 0, 0] if data_type == 'and' else [1, 1, 1, 0])elif data_type == 'not':X = np.asarray([0, 1])Y = np.asarray([1, 0])# 隨機打亂輸入矩陣 X 和標簽 Yidx = np.arange(len(X))np.random.shuffle(idx)X_test = X[idx]Y_test = Y[idx]return X, Y, X_test, Y_test二、網絡結構[^ 3]
??一個生物神經細胞的功能比較簡單,而人工神經元只是生物神經細胞的理想化和簡單實現,功能更加簡單,要想模擬人的腦力,需要很多神經元一起協作來完成復雜的功能。這樣通過一定的連接方式或信息傳遞方式進行協作的神經元可以看成一個網絡,就是神經網絡。
神經網絡的核心組件是層,它是一種數據處理模塊,可以將它看出數據過濾器(進去一些數據,出來更有用的數據),大多數深度學習都是將簡單的層鏈接起來,從而實現漸進式 數據蒸餾。
1、前饋網絡
??前饋網絡中各個神經元按接收信息的先后分為不同的組,每一組可以看成一個神經層,每一層的神經元接收前一層神經元的輸出,并輸出到下一層神經元。整個網絡的信息是朝一個方向傳播,沒有反向傳播的信息。
??前饋網絡可以看成是一個函數,通過簡單非線性函數的多次復合,實現輸入空間到輸出空間的復雜映射。
2、記憶網絡
??也稱為反饋網絡,網絡中的神經元不但可以接收其他神經元的信息,也可以接收自己的歷史信息,和前饋網絡相比,記憶網絡中的神經元具有記憶功能,在不同時刻有不同的狀態。
3、圖網絡
??圖網絡是定義在圖結構數據上的神經網絡,圖中每個節點都由一個或一組神經元構成,節點之間的連接可以是有向的,也可以是無向的,每個節點可以收到來自相鄰節點或自身的信息。
三、前饋網絡和反向傳播算法
??推薦一組視頻:三藍一棕深度學習系列,講的比較易懂透徹。
??也被稱為多層感知器,由多層 Logistic 回歸模型組成,在這個網絡中,每一層的神經元可以接收前一層的神經元的信號,并產生信號輸出到下一層,,第0層被稱為 輸入層,最后一層被稱為 輸出層,其他中間層稱為 隱藏層。整個網絡中無反饋,信號從輸入層向輸出層單向傳播。
LLL:神經網絡層數
MlM_lMl? :第 lll 層神經元的個數
fl(?)f_l(\cdot)fl?(?):第 lll? 層神經元的激活函數
$W^{(l)} \in R^{M_l \times M_{l-1}} $:第 l?1l - 1l?1 層到第 lll? 層的權重矩陣
b(l)∈RMlb^{(l)} \in R^{M_l}b(l)∈RMl?:第 l?1l-1l?1 層到第 lll 層的偏置
z(l)∈RMlz^{(l)} \in R^{M_l}z(l)∈RMl?:第 lll 層神經元的凈輸入(凈活性值)
a(l)∈RMla^{(l)} \in R^{M_l}a(l)∈RMl?:第 lll 層神經元的輸出(活性值)
??令 a(0)=xa^{(0)} = xa(0)=x,前饋神經網絡通過不斷迭代下面公式進行信息傳播:
z(l)=W(l)a(l?1)+b(l)a(l)=fl(z(l))(1)z^{(l)} = W^{(l)}a^{(l-1)}+b^{(l)} \\ a^{(l)} = f_l(z^{(l)}) \tag{1} z(l)=W(l)a(l?1)+b(l)a(l)=fl?(z(l))(1)
??第 l?1l-1l?1 層神經元的活性值 al?1a^{l-1}al?1 計算出第 lll 層神經元的凈活性值 z(l)z^{(l)}z(l)?,然后經過一個激活函數得到第 lll 層神經元的活性值,因此,可以把每個神經層看作一個 仿射變換 和一個非線性變化。
z(l)=W(l)f(l?1)(z(l?1))+b(l)或者a(l)=fl(W(l)a(l?1)+b(l))z^{(l)} = W^{(l)} f_{(l-1)} (z^{(l-1)}) + b^{(l)} \\ 或者 \qquad a^{(l)} = f_l(W^{(l)} a^{(l-1)} + b^{(l)}) z(l)=W(l)f(l?1)?(z(l?1))+b(l)或者a(l)=fl?(W(l)a(l?1)+b(l))
??要想控制一個事物,首先要能夠觀察它,因此神經網絡損失函數的任務就是衡量輸出與預測之間的距離,接著利用這個距離值作為反饋信號來對權重進行微調,以降低損失函數的值,這種調節由優化器完成,它實現了 反向傳播算法,也就是常說的 BP神經網絡:
BP神經網絡是一種多層的前饋神經網絡,其主要的特點是:信號是前向傳播的,而誤差是反向傳播的。
??BP神經網絡的過程主要分為兩個階段,第一階段是信號的前向傳播,從輸入層經過隱含層,最后到達輸出層;第二階段是誤差的反向傳播,從輸出層到隱含層,最后到輸入層,依次調節隱含層到輸出層的權重和偏置,輸入層到隱含層的權重和偏置。
以下用代碼實現了 BP神經網絡 的簡單分類與回歸。
1、代碼實現
??利用 python 的上層 API 快速構建神經網絡,以手寫數字集分類以及sklearn創建的回歸數據集為例,由于剛剛接觸,代碼的實現可能較為笨拙:
1.1 回歸
from sklearn.datasets import make_regression from sklearn.model_selection import train_test_splits# 創建一個回歸數據集,樣本數為10000,特征數量為10,回歸目標數量為1,噪聲值為0.1 (X, y, coef) = make_regression(n_samples=10000, n_features=10, n_targets=1, bias=0.1, noise=0.1, coef=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) from keras.layers import Dense from keras.models import Sequential# 創建一個序貫模型(多個網絡層的線性堆疊) model = Sequential() # 加入隱藏層,神經元數量為10,輸入特征量為10維,使用 tanh 函數作為激活函數 model.add(Dense(10, input_dim=10, activation='tanh')) # 由于回歸預測值是單個值,所以輸出層神經元數量為1 model.add(Dense(1)) # 打印模型信息 model.summary() # 打印的模型信息Model: "sequential_3" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_7 (Dense) (None, 10) 110 _________________________________________________________________ dense_8 (Dense) (None, 1) 11 ================================================================= Total params: 121 Trainable params: 121 Non-trainable params: 0 _________________________________________________________________ # 編譯模型,優化器為隨機梯度下降,損失函數為mse model.compile(optimizer='sgd', loss='mse') # 訓練模型,模型迭代1000次,每次梯度更新的樣本數為64,fit方法會返回一個History對象 his = model.fit(X_train, y_train, epochs=1000, verbose=0, batch_size=64) # 測試模型,返回誤差值和評估標準值,cost 在此是 mse 值 cost = model.evaluate(X_test, y_test, batch_size=500)??接下來看一看損失函數的圖像
??可以看到幾乎在訓練開始損失函數的值就降到了最低,如果想提前終止訓練,可以調用 keras.callbacks 內的函數并作為 fit 方法 callbacks 屬性的參數。
看一下回歸效果 R2 的評分
from sklearn.metrics import r2_scoreprint(r2_score(y_test, model.predict(X_test))) 0.9855140848830662??此時模型分數已經接近1了,擬合效果較好,但可能存在過擬合問題。
1.2 分類
from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD from keras.datasets import mnist import numpy model = Sequential() # 以最經典的手寫數字識別為例,每張圖像尺寸為 28 * 28,因此輸入維度為 784 # 創建有兩個 500 個神經元的隱藏層,每個神經元會學習到一點特征,學習到什么不需要我們考慮,以 sigmoid 為激活函數 # 為了防止過擬合,每次讓一半的神經元停止工作 model.add(Dense(500,input_shape=(784,))) model.add(Activation('sigmoid')) model.add(Dropout(0.5)) model.add(Dense(500)) model.add(Activation('sigmoid')) model.add(Dropout(0.5)) # 手寫數字集的數字集為 0-9,共十類,因此用多分類 sotfmax 作為激活函數,輸出層設置10個神經元,活性值最高的神經元即是預測結果 model.add(Dense(10)) model.add(Activation('softmax')) # 梯度下降作為優化器,學習率為0.01 sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd) # 載入手寫數字集 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2]) Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) Y_test = (numpy.arange(10) == y_test[:, None]).astype(int) # 開始訓練,訓練200次,以訓練集的30%作為驗證集 model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3) scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0print(scores) result = model.predict(X_test,batch_size=200,verbose=0)result_max = numpy.argmax(result, axis = 1) test_max = numpy.argmax(Y_test, axis = 1)result_bool = numpy.equal(result_max, test_max) true_num = numpy.sum(result_bool) print("") print(true_num/len(result_bool)) 0.148803 0.955900識別準確率達到了 95.59%
四、參考文獻
[^ 1]: 深度學習大講堂 李揚 ,深度學習中的激活函數導引.https://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650325236&idx=1&sn=7bd8510d59ddc14e5d4036f2acaeaf8d&mpshare=1&scene=1&srcid=1214qIBJrRhevScKXQQuqas4&pass_ticket=w2yCF/3Z2KTqyWW/UwkvnidRV3HF9ym5iEfJ+Z1dMObpcYUW3hQymA4BpY9W3gn4#rd , 2016-08-01
[^ 2]: 魯睿元 祝繼華,《Keras深度學習》[M],北京市海淀區玉淵潭南路1號D座;中國水利水電出版社,2019年
[^ 3]: 邱錫鵬,《神經網絡與深度學習》[M],北京市西城區百萬莊大街22號;機械工業出版社,2020年
總結
以上是生活随笔為你收集整理的1. 全连接神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 确定性网络:从“尽力而为”到“确定承诺”
- 下一篇: 利用VML标记语言画图、动画制作