【CS231n】Spring 2020 Assignments - Assignment1 - Softmax
文章目錄
前言
我的作業是在 Google Colaboratory 上完成的,還是挺方便的。
一、Implement softmax_loss_naive(W, X, y, reg)
邏輯迴歸分類器(Softmax Classifier):希望正確類別得到的概率分數接近 1 ;
Softmax 損失函式(常用,也叫多項式邏輯迴歸):我們用 softmax 對分數進行轉化處理(即不直接使用),並得到正確類別的損失函式是 − l o g P -logP −logP ;公式如下
L i = − l o g ( e s y i ∑ j e s j ) L_i = -\ log(\frac{e^{s_{y_i}}}{\sum_{j}{e^{s_j}}}) Li=− log(∑jesjesyi)
綜上,損失的計算還是比較簡單。先求出分數 Scores,將 Scores 正數化( e S e^S eS),再將 Scores 歸一化,即除以每個資料樣本在每個類的得分總和,這樣就可以得出概率 P 了。那對於每個資料樣本 X i X_i Xi , L i = − l o g ( e s y i ∑ j e s j ) L_i = -\ log(\frac{e^{s_{y_i}}}{\sum_{j}{e^{s_j}}}) Li=− log(∑jesjesyi)。
可是計算梯度 dW 就比較複雜了,因為這個損失函式比較複雜,可以參考下面這篇文章:
多分類器softmax——絕對簡單易懂的梯度推導 by 月下花弄影
裡面講得很詳細。
下面是程式碼:
num_train = X.shape[0]
num_classes = W.shape[1]
scores = X.dot(W)
positive_scores = np.e ** scores
softmax = positive_scores / np.sum(positive_scores, axis=1).reshape((num_train, 1))
for i in range(num_train):
for j in range(num_classes):
if j == y[i]:
loss += -np.log(softmax[i][j])
dW[:, j] += (softmax[i][j] - 1) * X[i]
else:
dW[:, j] += softmax[i][j] * X[i]
loss /= num_train
loss += reg * np.sum(W*W)
dW /= num_train
dW += 2 * reg * W
二、Implement softmax_loss_vectorized(W, X, y, reg)
這題和 SVM 的第二題差不多。損失是比較好求的,比較難的仍然是梯度矩陣。
總體思路是構造出一個矩陣,讓它和 X 點乘能夠得到 dW 。從上一題中我們可以看到 dW[:, j] 都需要加上 X[i] ,只不過當 j = y[i] 時的係數需要減 1 ,那麼很自然的我們先將 softmax 相應的項減去1,再與 X.T 點乘即可得到 dW。當然最後別忘了除以 num_train 以及 進行正則化懲罰。
num_train = X.shape[0]
num_classes = W.shape[1]
dim = X.shape[1]
scores = X.dot(W)
positive_scores = np.e ** scores
softmax = positive_scores / np.sum(positive_scores, axis=1).reshape((num_train, 1))
loss = np.sum((-np.log(softmax))[range(num_train), y])
softmax[range(num_train), y] -= 1
dW = X.T.dot(softmax)
loss /= num_train
loss += reg * np.sum(W*W)
dW /= num_train
dW += 2 * reg * W
三、Write code that chooses the best hyperparameters
這一題的思路跟 SVM 裡面的完全一樣,想看思路的同學可以看我的上一篇部落格。
需要注意的是,我選用的引數都是經過對比、選擇最後得出來的,並不是一開始就將 learning_rate_step_size, regularization_strength_step_size, num_iters 這些引數設成這個值的。
其實研究了一下其他同學的程式碼之後,我嘗試了一下,發現不怕耗費時間的同學真的可以將 num_iters 固定成一個比較大的值,這樣訓練出來的結果會準確很多,對於區間的選擇也更精準。
learning_rate_step_size = (1.288000e-06 - 0.5e-7) / 15
regularization_strength_step_size = (4.200000e+04 - 1e4) / 15
lr = 1e-7 - learning_rate_step_size
regularization_strength = 1e4 - regularization_strength_step_size
best_lr = 0.
best_regularization_strength = 0.
for i in range(15):
lr += learning_rate_step_size
regularization_strength = 1e4
for j in range(15):
regularization_strength += regularization_strength_step_size
new_softmax = Softmax()
new_softmax.train(X_train, y_train, learning_rate=lr, reg=regularization_strength, num_iters=700, verbose=False)
y_train_pred = new_softmax.predict(X_train)
training_accuracy = np.mean(y_train == y_train_pred)
y_val_pred = new_softmax.predict(X_val)
validation_accuracy = np.mean(y_val == y_val_pred)
if validation_accuracy > best_val:
best_val = validation_accuracy
best_softmax = new_softmax
best_lr = lr
best_regularization_strength = regularization_strength
results[(lr, regularization_strength)] = (training_accuracy, validation_accuracy)
# Train best_softmax and update bast_value
best_softmax.train(X_train, y_train, best_lr, best_regularization_strength, num_iters=800, verbose=True)
y_val_pred = best_softmax.predict(X_val)
best_val = np.mean(y_val == y_val_pred)
print('best_lr:', best_lr, 'best_regularization_strength:', best_regularization_strength)
總結
學習CS231n對數學的要求真的蠻高的。
相關文章
- 【CS231n】Spring 2020 Assignments - Assignment1 - Two Layer NetSpring
- HDU 3661 Assignments
- softmax-regression
- tf中softmax_cross_entropy_with_logits與sparse_softmax_cross_entropy_with_logitsROSGit
- Softmax迴歸簡介
- Softmax分類函式函式
- cs231n lecture1 introduction
- 卷積神經網路系列之softmax,softmax loss和cross entropy的講解卷積神經網路ROS
- softmax負取樣和nce loss
- 論文解讀(GRCCA)《 Graph Representation Learning via Contrasting Cluster Assignments》AST
- Keras上實現Softmax迴歸模型Keras模型
- 2020-5-23-SpringSpring
- 圖示Softmax及交叉熵損失函式熵函式
- Spring AOP2020-09-29Spring
- 史丹佛CS231n課程筆記純乾貨2筆記
- 史丹佛CS231n課程筆記純乾貨1筆記
- spring cloud 2020 gateway 報錯503SpringCloudGateway
- 簡單介紹pytorch中log_softmax的實現PyTorch
- 機器學習之多類別神經網路:Softmax機器學習神經網路
- ML-邏輯迴歸-Softmax-交叉熵(小航)邏輯迴歸熵
- 微服務 Spring Cloud 2020 重大變革微服務SpringCloud
- tf.keras實現邏輯迴歸和softmax多分類Keras邏輯迴歸
- Spring Boot面試題(2020最新版)Spring Boot面試題
- 李飛飛 CS231n 最全學霸筆記精煉版來了筆記
- 深度學習實驗:Softmax實現手寫數字識別深度學習
- 【TensorFlow篇】--Tensorflow框架實現SoftMax模型識別手寫數字集框架模型
- 重磅 | 李飛飛 CS231n 官方筆記授權翻譯正式釋出!筆記
- 數值解和解析解/softmax迴歸/泰勒展開/牛頓法
- CS231n 神經網路 第3部分: 學習和評估(上)神經網路
- MIT 6.824(Spring 2020) Lab1: MapReduce 文件翻譯MITSpring
- 深度學習筆記1:池化 全連線 啟用函式 softmax深度學習筆記函式
- Spring Boot基礎面試題2020大集合Spring Boot面試題
- 史丹佛自然語言處理習題課2---softmax函式詳解自然語言處理函式
- 基於GRU和am-softmax的句子相似度模型 | 附程式碼實現模型
- softmax迴歸——原理、one-hot編碼、結構和運算、交叉熵損失熵
- 用於判別式人臉驗證的L2-約束softmax損失
- 有網友說:2020年還不懂Spring就放棄Java吧?SpringJava
- Spring5框架2020最新版教程(二)IOC底層原理Spring框架