【Kaggle-MNIST之路】CNN+改进过的损失函数+多次的epoch(四)
生活随笔
收集整理的這篇文章主要介紹了
【Kaggle-MNIST之路】CNN+改进过的损失函数+多次的epoch(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
- 上一個代碼
在看完很多版本的代碼,看了下,發現一個問題,隨著epoch的次數逐漸上升,精度會一定程度上上升。(有時候也不一定)
所以,懷疑自己的這個代碼還有改進的空間,所以,在提高了一下epoch的次數。但是要稍微降低一下Learning Rate。
邏輯解釋
- 稍微降低一下Learning Rate的原因:
假設是一個簡單的優化問題,擔心LR太大,就直接滑動過去了。。
目前成績
- 分數:0.9790
- 排名:1500+
代碼
import pandas as pd import torch.utils.data as data import torch import torch.nn as nnfile = './all/train.csv' LR = 0.0008class MNISTCSVDataset(data.Dataset):def __init__(self, csv_file, Train=True):self.dataframe = pd.read_csv(csv_file, iterator=True)self.Train = Traindef __len__(self):if self.Train:return 42000else:return 28000def __getitem__(self, idx):data = self.dataframe.get_chunk(100)ylabel = data['label'].as_matrix().astype('float')xdata = data.ix[:, 1:].as_matrix().astype('float')return ylabel, xdataclass CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.layer1 = nn.Sequential(# (1, 28, 28)nn.Conv2d(in_channels=1,out_channels=16,kernel_size=5, # 卷積filter, 移動塊長stride=1, # filter的每次移動步長padding=2,groups=1),# nn.BatchNorm2d(16),# (16, 28, 38)nn.ReLU(),nn.MaxPool2d(kernel_size=2)# (16, 14, 14))self.layer2 = nn.Sequential(nn.Conv2d(in_channels=16,out_channels=32,kernel_size=5,stride=1,padding=2),# nn.BatchNorm2d(32),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.layer3 = nn.Linear(32 * 7 * 7, 10)def forward(self, x):# print(x.shape)x = self.layer1(x)# print(x.shape)x = self.layer2(x)# print(x.shape)x = x.view(x.size(0), -1)# print(x.shape)x = self.layer3(x)# print(x.shape)return xnet = CNN()loss_function = nn.MultiMarginLoss() optimizer = torch.optim.Adam(net.parameters(), lr=LR) EPOCH = 5 for epo in range(EPOCH):mydataset = MNISTCSVDataset(file)train_loader = torch.utils.data.DataLoader(mydataset, batch_size=1, shuffle=True)for step, (yl, xd) in enumerate(train_loader):xd = xd.reshape(100, 1, 28, 28).float()output = net(xd)yl = yl.long()loss = loss_function(output, yl.squeeze())optimizer.zero_grad()loss.backward()optimizer.step()if step % 20 == 0:print('step %d-%d' % (step, epo), loss)torch.save(net, 'divided-net.pkl')總結
到這里,就很容易搞懂了,為什么大家都喜歡單獨把模型的放在一個固定的文件夾中。現在也是理解了。
因為如果要改那個生成數據的py文件的話,重新加載是需要有復制這個類到另外生成數據的py文件下的。
這樣就很麻煩了,所以大家就會提出搞一個模型文件夾。然后只需要加載的時候的模型參數就好了。
此外,提高一下epoch的次數,可以提高精度。但是理論上這個是有限的。
接下來只能改模型,改損失函數,改讀取數據方式來提高了。
總結
以上是生活随笔為你收集整理的【Kaggle-MNIST之路】CNN+改进过的损失函数+多次的epoch(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kaggle-MNIST之路】CNN+
- 下一篇: 模拟退火算法理论+Python解决函数极