🎬個人簡介:一個全棧工程師的升級之路!
📋個人專欄:pytorch深度學習
🎀CSDN主頁?發狂的小花
🌄人生秘訣:學習的本質就是極致重復!
《PyTorch深度學習實踐》完結合集_嗶哩嗶哩_bilibili?
目錄
1 Logistic Regression
2 整體流程
3 Softmax 多分類
4 交叉熵crossEntropy
5 Logistic Regression 代碼
1 Logistic Regression
區別于Linear Regression,加入了激活函數,引入非線性。
一個二分類問題:
給定學習時長x,y為考試是否可以通過,通過為1,不通過為0
使用二分類激活函數sigmod,softmax多分類在只有兩個分類時,也可以變成sigmoid
2 整體流程
- 數據準備:
- 模型建立:
- Loss建立
?
- mini-Batch Loss for Binary Classification
3 Softmax 多分類
一文徹底搞懂 Softmax 函數,數學原理分析和 PyTorch 驗證?
softmax就是將一些大的數字拉伸到0~1之間,而且使得大的數所占的比例更大,小的數所占的比例更小,這樣如果每一個原始的數據代表score的話,將其總分控制在0~1之間,可以進一步使用交叉熵函數來計算loss。
這里Softmax會帶來一些數據上溢和下溢問題,上溢問題可以減去max(y),下溢問題可以使用log(y)等手段來解決。
一個簡單的softmax的例子:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>#define SIZE (4)void softMax(double *src,double *dst,const int N)
{double exp_score[N];double sum = 0.f;for (int i = 0;i < N;i++){exp_score[i] = exp(src[i]);sum += exp_score[i];}for (int i = 0;i < N;i++){dst[i] = exp_score[i] / sum; }}int main(int argc, char *argv[])
{double score[SIZE] = {2.1,2.0,0.1,3.7};double probability[SIZE] = {0.f};softMax(score,probability,SIZE);printf("Probability:[");for (int i = 0;i < SIZE;i++){printf(" %f ",probability[i]);}printf(" ]\n");return 0;
}
4 交叉熵crossEntropy
計算兩個概率分布之間的差異的,由于Softmax和Sigmod都將score轉化為了概率分布,因此可以將交叉熵作為損失函數來計算y_true和y_pred之間的差異。
?
softmax分類器和交叉熵損失函數
一個多分類的交叉熵例子:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>#define M (3)
#define N (4)double crossEntropy(double *y_true,double *y_pred,int m,int n)
{// 防止log(0)的情況,對預測概率分布進行微小的修正for (int i = 0;i < m;i++){for (int j = 0;j < n;j++){y_pred[i*n+j] = y_pred[i*n+j] <= 0 ? (1e-7) : (y_pred[i*n+j] > 1 ? (1) : y_pred[i*n+j]);}}double sum = 0.f;for (int i = 0;i < m;i++){for (int j = 0;j < n;j++){sum += -y_true[i*n+j] * log2(y_pred[i*n+j]);}}return (sum / (double)m);
}int main(int argc, char *argv[])
{// one-hot 編碼 代表標簽分類 例如: 貓 狗 鳥 豬// 真實概率分布double probability[M][N] = {{1,0,0,0},{0,1,0,0},{0,0,1,0}};// double y_pred[M][N] = {{0.7,0.2,0.05,0.05},{0,1,0,0},{0.1,0.1,0.8,0}};double y_pred[M][N] = {{0.98,0.02,0,0},{0,1,0,0},{0,0,1,0}};double loss = crossEntropy(&probability[0][0],&y_pred[0][0],M,N);printf("loss: % .6lf \n",loss);return 0;
}
5 Logistic Regression 代碼
pytorch nn.BCELoss()詳解?
torch.empty()和torch.Tensor.random_()的使用舉例-CSDN博客?
import torch# prepare dataset
# 0 1 為分類標簽
# x_data 輸入 學習的時間
# y_data 輸出 考試通過與否(0 or 1)
x_data = torch.Tensor([[1.0], [2.0], [3.0],[1.1],[2.1],[1.5],[2.3],[4.1]])
y_data = torch.Tensor([[0], [0], [1],[0],[0],[0],[0],[1]])class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear = torch.nn.Linear(1,1)def forward(self, x):y_pred = torch.sigmoid(self.linear(x))return y_pred
model = LogisticRegressionModel()# construct loss and optimizer
criterion = torch.nn.BCELoss(size_average = True)
optimizer = torch.optim.Adam(model.parameters(), lr = 0.05)# training cycle forward, backward, update
for epoch in range(10000):y_pred = model(x_data)loss = criterion(y_pred, y_data)print(epoch, loss.item())optimizer.zero_grad()loss.backward()optimizer.step()if (loss < 1e-7):breakprint('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())# test dataset
x_test = torch.Tensor([[4.0],[5.0],[1.5],[2.5],[2.9],[3.0]])
y_test = model(x_test)
print('y_pred = ', y_test.data)
🌈我的分享也就到此結束啦🌈
如果我的分享也能對你有幫助,那就太好了!
若有不足,還請大家多多指正,我們一起學習交流!
📢未來的富豪們:點贊👍→收藏?→關注🔍,如果能評論下就太驚喜了!
感謝大家的觀看和支持!最后,?祝愿大家每天有錢賺!!!歡迎關注、關注!