pytorch 训练过程acc_深度学习Pytorch实现分类模型
在分類問題中,通常標簽都為類別,可以用離散值來代替。例如,在圖像分類問題中,假設一張圖片是的灰度圖片,那么圖片中的4個像素值便是特征。假設對應的標簽是貓狗等動物,其都是離散值,在深度學習模型中都是采用這樣的離散值來代替。
02神經(jīng)網(wǎng)絡模型Softmax回歸同線性回歸一樣,也是一個單層神經(jīng)網(wǎng)絡。由于每個輸出?,,??的計算都要依賴于所有的輸入,?,?,?,softmax回歸的輸出層也是一個全連接層。那么其模型可以表達為:
既然分類問題需要得到離散的預測輸出,一個簡單的辦法是將輸出值?當作預測類別是的?置信度,并將值最大的輸出所對應的類作為預測輸出,即輸出. 例如,?,,??分別為0.1,5,0.1,那么該預測類別便是2。
但是這樣存在問題:
一方面,由于輸出層的輸出值的范圍不確定,我們難以直觀上判斷這些值的意義。如果某個樣本輸出值,,??分別為0.1,10,0.1,那么說明該樣本非??赡転榈诙?#xff0c;但是如果另外一個樣本的輸出值,,?分別為1000,10,1000,那這個10卻表示的是為第二類的概率很低;
另一方面,由于真實標簽是離散值,這些離散值與不確定范圍的輸出值之間的誤差難以衡量。
因此需要將每個樣本的輸出值歸一化,即softmax運算:
其中
可以看出,。取為某類的概率。
一般的,softmax回歸的矢量計算表達式為:
假設樣本數(shù)為,特征數(shù)為,輸出個數(shù)(類別數(shù))為,那么的維度為,的維度為,的維度為。
交叉熵(cross entropy)是一個常用的衡量兩個概率分布差異的測量函數(shù):
例如,樣本的預測輸出值分別為[0.2,0.6,0.2],即上式中的預測值,其真實類別為[0,1,0],即上式中的。也就是說,交叉熵只關心對正確類別的預測概率,因為只要其值足夠大,就可以確保分類結果正確。
假設訓練數(shù)據(jù)集的樣本數(shù)為,交叉熵損失函數(shù)定義為:
最小化交叉熵損失函數(shù)等價于最大化訓練數(shù)據(jù)集所有標簽類別的聯(lián)合預測概率。
在訓練好softmax回歸模型后,給定任一樣本特征,就可以預測每個輸出類別的概率。通常,我們把預測概率最大的類別作為輸出類別。如果它與真實類別(標簽)一致,說明這次預測是正確的。可以使用準確率(accuracy)來評價模型的表現(xiàn)。它等于正確預測數(shù)量與總預測數(shù)量之比。
05獲取數(shù)據(jù)此處使用的是使用一個圖像內容更加復雜的數(shù)據(jù)集Fashion-MNIST[2]。去下載。
這里我們會使用torchvision包,它是服務于PyTorch深度學習框架的,主要用來構建計算機視覺模型。torchvision主要由以下幾部分構成:
torchvision.datasets: 一些加載數(shù)據(jù)的函數(shù)及常用的數(shù)據(jù)集接口;
torchvision.models: 包含常用的模型結構(含預訓練模型),例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的圖片變換,例如裁剪、旋轉等;
torchvision.utils: 其他的一些有用的方法。
數(shù)據(jù)展示:
06實現(xiàn)import matplotlib.pyplot as pltimport torchimport torchvisionimport numpy as npimport torchvision.transforms as transformsimport timeimport sysdef getData(): # train:指定是否為訓練集 download:是否下載,如果本地已經(jīng)有了則不會下載 # (可被調用 , 可選)– 一種函數(shù)或變換,輸入PIL圖片,返回變換之后的數(shù)據(jù)。如:transforms.RandomCrop。 mnist_train = torchvision.datasets.FashionMNIST(root='data/', train=True, download=True, transform=transforms.ToTensor()) # 如果無法下載,可https://github.com/zalandoresearch/fashion-mnist # 放進data/FashionMNIST\raw\train-images-idx3-ubyte.gz mnist_test = torchvision.datasets.FashionMNIST(root='data/', train=False, download=True, transform=transforms.ToTensor())????return?mnist_train,?mnist_test# softmax運算def softmax(X): X_exp = X.exp() partition = X_exp.sum(dim=1, keepdim=True) return X_exp / partition # 這里應用了廣播機制# softmax模型def model(X, W, b):????return?softmax(torch.mm(X.view((-1,?W.shape[0])),?W)?+?b)# 損失函數(shù)def cross_entropy(y_hat, y): # 按y中的數(shù)字取相應的列 return - torch.log(y_hat.gather(1, y.view(-1, 1)))# 準確率def evaluate_accuracy(data_iter, net, params): acc_sum, n = 0.0, 0 for X, y in data_iter: acc_sum += (net(X, params[0], params[1]).argmax(dim=1) == y).float().sum().item() n += y.shape[0] return acc_sum / ndef train(net, train_iter, test_iter, loss, num_epochs, batch_size, params=None, lr=None, optimizer=None): for epoch in range(num_epochs): train_l_sum, train_acc_sum, n = 0.0, 0.0, 0 for X, y in train_iter: y_hat = net(X, params[0], params[1]) l = loss(y_hat, y).sum() # 梯度清零 if optimizer is not None: optimizer.zero_grad() elif params is not None and params[0].grad is not None: for param in params: param.grad.data.zero_() l.backward() if optimizer is None: sgd(params, lr, batch_size) # 梯度更新 else:????????????????optimizer.step()? train_l_sum += l.item() train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item() n += y.shape[0] test_acc = evaluate_accuracy(test_iter, net, params) print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))def predict(net, test_iter, params): X, y = iter(test_iter).next() true_labels = get_fashion_mnist_labels(y.numpy()) pred_labels = get_fashion_mnist_labels(net(X, params[0], params[1]).argmax(dim=1).numpy()) titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)] show_fashion_mnist(X[0:9], titles[0:9])def main(): # 超參數(shù) num_epochs, lr = 5, 0.1 batch_size = 256 # 批量大小 num_inputs = 28*28 # 圖像的高和寬 num_outputs = 10 # 一共十種類別 train_iter, test_iter = loadData(batch_size) W, b = init_parameters(num_inputs, num_outputs) train(model, train_iter, test_iter, cross_entropy, num_epochs, batch_size, [W, b], lr) # 預測 predict(model, test_iter, [W, b])if __name__ == '__main__': # getData() # 獲取數(shù)據(jù) # show() # 展示數(shù)據(jù) main() # 自己實現(xiàn)07結果及預測epoch 1, loss 0.7874, train acc 0.749, test acc 0.791epoch 2, loss 0.5712, train acc 0.812, test acc 0.813epoch 3, loss 0.5250, train acc 0.826, test acc 0.820epoch 4, loss 0.5018, train acc 0.833, test acc 0.824epoch 5, loss 0.4860, train acc 0.837, test acc 0.827可以看出測試集上能夠達到80%以上的準確率。模型訓練完后,便可以進行預測。給定一系列圖像(第三行圖像輸出),比較一下它們的真實標簽(第一行文本輸出)和模型預測結果(第二行文本輸出)。
如需源碼,請后臺回復 "softmax回歸"。有什么問題,可添加微信 "wxid-3ccc".
雙向Dijkstra算法
EndNote引文編排
利用GN算法進行社區(qū)發(fā)現(xiàn)
Python爬取高德地圖--瓦片圖
水位時態(tài)數(shù)據(jù)在地圖上的動態(tài)展示
深度學習--Pytorch實現(xiàn)線性規(guī)劃
ArcPy批量定義投影和批量投影轉換
機器人局部規(guī)劃算法--DWA算法原理
ArcGIS時間滑塊實現(xiàn)車輛軌跡動態(tài)展示
多時間序列數(shù)據(jù)MK突變檢驗突變點提取
世界各國GDP排名變化--Matlab動圖實現(xiàn)
世界各國GDP排名變化--Python動圖實現(xiàn)
▼更多精彩推薦,敬請關注我們▼我就知道你“在看”總結
以上是生活随笔為你收集整理的pytorch 训练过程acc_深度学习Pytorch实现分类模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: basler相机的触发线是那两脚_机器视
- 下一篇: 深度学习模型保存_解读计算机视觉的深度学