代碼如下:
1、資料集類
import os;
import torch.utils.data as data;
import numpy as np;
import torch;
import torchvision.transforms as transforms;
from PIL import Image
data_transform=transforms.Compose([
transforms.ToTensor()
]);
IMAGE_H = 200;
IMAGE_W = 200;
class DogCatDataset(data.Dataset):
def __init__(self,mode,dir):
self.mode=mode;
self.list_img=[];
self.list_label=[];
self.data_size=0;
self.transform=data_transform;
if self.mode=='train':
dir=dir+'/train/';
for file in os.listdir(dir):
self.list_img.append(dir+file);
self.data_size+=1;
name=file.split(sep='.');
if name[0]=='cat':
self.list_label.append(0);
else:
self.list_label.append(1);
elif self.mode=='test':
dir=dir+'/test/';
for file in os.listdir(dir):
self.list_img.append(dir+file);
self.data_size+=1;
self.list_label.append(2);
else:
return print('undefined dataset');
def __getitem__(self, item):
if self.mode=='train':
img = Image.open(self.list_img[item]) # 打開圖片
img = img.resize((IMAGE_H, IMAGE_W)) # 將圖片resize成統一大小
img = np.array(img)[:, :, :3] # 資料轉換成numpy陣列形式
label = self.list_label[item] # 獲取image對應的label
return self.transform(img), torch.LongTensor([label])
elif self.mode=='test':
img=Image.open(self.list_img[item]);
img=img.resize((IMAGE_W,IMAGE_H));
img=np.array(img)[:,:,:3];
return self.transform(img);
else:
print('None');
def __len__(self):
return self.data_size;
神經網路結構:
import torch;
import torch.nn as nn;
import torch.utils.data;
import torch.nn.functional as F;
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__();
self.conv1 = torch.nn.Conv2d(3, 16, 3, padding=1)
self.conv2 = torch.nn.Conv2d(16, 16, 3, padding=1)
self.fc1 = nn.Linear(50 * 50 * 16, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 2)
def forward(self,x):
x = self.conv1(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = self.conv2(x)
x = F.relu(x)
x = F.max_pool2d(x, 2)
x = x.view(x.size()[0], -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return F.softmax(x, dim=1)
# x=F.relu(self.fc2(x));
# x=F.relu(self.fc3(x));
# x=F.relu(self.fc4(x));
# x=self.fc5(x);
#return F.softmax(x,dim=1);
訓練資料集類:
from DogCatImageDataset import DogCatDataset as DVCD;
from torch.utils.data import DataLoader as DataLoader;
from TrainNet import Net;
import torch;
from torch.autograd import Variable;
import torch.nn as nn;
import torchvision.transforms as transforms;
import matplotlib.pyplot as plt;
dataset_dir='./data/';
model_cp='./model/';
workers=10;
batch_size=50;
lr=0.0001;
epochs=10;
def train():
transform_train=transforms.Compose([
transforms.Normalize(std=(0.5,0.5,0.5),mean=(0.5,0.5,0.5))
]);
datafile=DVCD('train',dataset_dir);
dataloader=DataLoader(datafile,batch_size=batch_size,shuffle=True,num_workers=workers);
print('Dataset loaded! length of train set is {0}'.format(len(datafile)));
model=Net();
optimizer=torch.optim.SGD(model.parameters(),lr=lr,momentum=0.9);
creiterion=torch.nn.CrossEntropyLoss();
cnt=0;
losses=[];
for i in range(epochs):
#model.train();
print('epochs:{0}'.format(i));
for j,(img,label) in enumerate(dataloader):
img,label=Variable(img),Variable(label);
optimizer.zero_grad();
out=model(img);
loss=creiterion(out,label.squeeze());
loss.backward();
optimizer.step();
#train_loss=loss/batch_size;
if j % 10 ==0:
losses.append(loss.float());
print('[epochs - {0} - {1}/{2}]loss:{3}'.format(i,j,len(datafile),loss.float()));
plt.clf();
plt.plot(losses);
plt.pause(0.01);
#cnt+=1;
#print('Frame {0},train_loss:{1}'.format(cnt*batch_size,loss/batch_size));
torch.save(model.state_dict(),'{0}model.pth'.format(model_cp));
if __name__=='__main__':
train();
loss曲線圖:

loss 日志:

大神,請教
uj5u.com熱心網友回復:
感覺需要調一下學習率,而且你這才開始,多等會兒看看……或者SGD換成粗暴的Adam吧看看效果吧
另:感覺卷積可以再堆幾層,兩層有點過于少了
uj5u.com熱心網友回復:
現在的學習率是0.0001,不行, 之前試過0.00001,也是不行,那我加點層試下
uj5u.com熱心網友回復:
batch_size的問題uj5u.com熱心網友回復:
加大epochs 設定到100 試試看轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/56964.html
標籤:人工智能技術
下一篇:敏捷開發是否可以不寫檔案?
