{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":false,"collapsed":true},"cell_type":"code","source":"import os  \nimport shutil  \nimport torch  \nimport collections  \nfrom torchvision import transforms,datasets  \nfrom __future__ import print_function, division  \nimport os  \nimport torch  \nimport pylab  \nimport pandas as pd  \nimport torch.nn as nn  \nimport torch.nn.functional as F  \n\nfrom torch.autograd import Variable  \nfrom skimage import io, transform  \nimport numpy as np  \nimport matplotlib.pyplot as plt  \nfrom torch.utils.data import Dataset, DataLoader  \nfrom torchvision import transforms, utils  \nimport math  \nfrom PIL import Image \n\n# Ignore warnings  \nimport warnings  \nwarnings.filterwarnings(\"ignore\")  \n  \nplt.ion()   # interactive mode  \nimport os\nprint(os.listdir(\"../input\"))\nfrom torch.utils.data import DataLoader\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"d32a7426-68e8-40aa-a4ad-b0a9eec4eb71","_uuid":"e71faec672986a723990bf358d83f315861f29b8","trusted":false,"collapsed":true},"cell_type":"code","source":"len(os.listdir(\"../input/train\"))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","collapsed":true,"trusted":false},"cell_type":"code","source":"import torch","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"78cf3055-3676-47e1-a7bd-099597434d54","_uuid":"0253952fc250669d4d4f20572236a17069430070","collapsed":true,"trusted":false},"cell_type":"code","source":"import os\nfrom PIL import  Image\nfrom torch.utils import data\nimport numpy as np\nfrom torchvision import  transforms as T\n\n\nclass DogCat(data.Dataset):\n    \n    def __init__(self,root,transforms=None,train=True,test=False):\n        '''\n        主要目标： 获取所有图片的地址，并根据训练，验证，测试划分数据\n        '''\n        self.test = test\n        self.transforms =transforms\n        imgs = [os.path.join(root,img) for img in os.listdir(root)] \n\n        # test1: data/test1/8973.jpg\n        # train: data/train/cat.10004.jpg \n        if self.test:\n            imgs = sorted(imgs,key=lambda x:int(x.split('.')[-2].split('/')[-1]))\n        else:\n            imgs = sorted(imgs,key=lambda x:int(x.split('.')[-2]))\n            \n        imgs_num = len(imgs)\n\n        if self.test:\n            self.imgs = imgs\n        elif train:\n            self.imgs = imgs[:int(0.7*imgs_num)]\n        else :\n            self.imgs = imgs[int(0.7*imgs_num):]\n            \n    \n        if transforms is None:\n            normalize = T.Normalize(mean = [0.485, 0.456, 0.406], \n                                     std = [0.229, 0.224, 0.225])\n\n            if self.test or not train: \n                self.transforms = T.Compose([\n                    T.Scale(224),\n                    T.CenterCrop(224),\n                    T.ToTensor(),\n                    normalize\n                    ]) \n            else :\n                self.transforms = T.Compose([\n                    T.Scale(256),\n                    T.RandomSizedCrop(224),\n                    T.RandomHorizontalFlip(),\n                    T.ToTensor(),\n                    normalize\n                    ]) \n                \n        \n    def __getitem__(self,index):\n        '''\n        一次返回一张图片的数据\n        '''\n        img_path = self.imgs[index]\n        if self.test: label = int(self.imgs[index].split('.')[-2].split('/')[-1])\n        else: label = 1 if 'dog' in img_path.split('/')[-1] else 0\n        data = Image.open(img_path)\n        data = self.transforms(data)\n        return data, label\n    \n    def __len__(self):\n        return len(self.imgs)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"61d11639-9f1f-49b5-a403-029ca22a3065","_uuid":"62947444c48a13d7a57c16ee791fc6b966348747","collapsed":true,"trusted":false},"cell_type":"code","source":"data_transform = transforms.Compose([  \n    transforms.Resize(84),    \n    transforms.CenterCrop(84),  \n    transforms.ToTensor(),  \n    transforms.Normalize(mean = [0.5,0.5,0.5],std = [0.5,0.5,0.5])  \n])  ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"4519b8cf-89d0-4fdd-b9cf-bd3b71da341d","_uuid":"4baea8b75477e7bb44bbc3ce7df4533f756d86c2","trusted":false,"collapsed":true},"cell_type":"code","source":"dogcat = DogCat(\"../input/train\",train=True)\ntest = DogCat(\"../input/train\",train=False,test=False)\npred = DogCat(\"../input/test\",test=True,train=False)\nprint(len(dogcat),len(test),len(pred))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"9a4e5ec5-1cec-4826-9522-e8c51f8e9b70","_uuid":"382b086c482956814a63be716932d4620bd67f8b","collapsed":true,"trusted":false},"cell_type":"code","source":"batch_size = 10\ntrain_dataloader = DataLoader(dogcat,batch_size=64,shuffle = True)\nvalid_dataloader  = DataLoader(test,batch_size=64,shuffle = True)\npred_dataloader = DataLoader(pred,batch_size=64,shuffle = True)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"a31c907d-1977-4d61-a620-6b0916c3bed3","_uuid":"5038a5fa8f0d23745b520b98ee3d101c1c557322","collapsed":true,"trusted":false},"cell_type":"code","source":"class Net(nn.Module):  \n    def __init__(self):  \n        super(Net,self).__init__()  \n          \n        self.conv1 = nn.Conv2d(3,6,5)  \n        self.pool = nn.MaxPool2d(2,2)  \n        self.conv2 = nn.Conv2d(6,16,5)  \n        self.fc1 = nn.Linear(16 * 18 * 18,800)  \n        self.fc2 = nn.Linear(800,120)  \n        self.fc3 = nn.Linear(120,2)  \n          \n    def forward(self,x):  \n        x = self.pool(F.relu(self.conv1(x)))  \n        x = self.pool(F.relu(self.conv2(x)))  \n        x = x.view(-1,16 * 18 * 18)  \n        x = F.relu(self.fc1(x))  \n        x = F.relu(self.fc2(x))  \n        x = self.fc3(x)  \n          \n        return x  \n  ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"937e9d07-9bb2-4d0b-9baf-09f9b0542482","_uuid":"3253aae766c5599695e278cf9100d8f87ff4b187","collapsed":true,"trusted":false},"cell_type":"code","source":"import torch.optim as optim  \nimport datetime\nfrom torchvision import models\n\nnet = Net()   \nnet = net.cuda()\n\ncirterion = nn.CrossEntropyLoss()  \noptimizer = optim.Adam(net.parameters(),lr=0.0001, betas=(0.9, 0.99))  \n  ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"29d5bd22-21ef-48f3-b9ff-d6f46e5427e7","_uuid":"4c5dc8e7075bf98b7ff2c934e15e32f3926790ae","trusted":false,"collapsed":true},"cell_type":"code","source":"net  = models.vgg16(pretrained=False).cuda()","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"908d4afe-7853-4635-8c81-62b008f9d27f","_uuid":"e2d252b553c580de9cc2ac374162a6c3cbd26fe4","scrolled":false,"trusted":false,"collapsed":true},"cell_type":"code","source":"\nfor epoch in range(50):  \n    running_loss = 0.0  \n      \n    for i,data in enumerate(train_dataloader):  \n        inputs,labels = data  \n        inputs = inputs.cuda()\n        labels = labels.cuda()\n        #print(type(inputs))\n        #print(type(labels))\n        inputs,labels = Variable(inputs),Variable(labels) \n        #print(data[1])\n        \n        optimizer.zero_grad()  \n        outputs = net(inputs)  \n        loss = cirterion(outputs,labels)  \n        loss.backward()  \n        optimizer.step()  \n          \n        running_loss += loss.data[0]  \n          \n        if i % 200 == 199:  \n            nowTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')#现在\n            print('[%d %5d] loss: %.3f, Time:' % (epoch + 1,i + 1,running_loss / 2000)) \n            print(nowTime)\n            running_loss = 0.0\n    \nprint('finished training!')  ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"04a4069f-2c2f-4e8d-87e3-ea09b34da7bf","_uuid":"9377c0a8603e4b80e19d8974a9f14893aea41f1b","collapsed":true,"trusted":false},"cell_type":"code","source":"correct = 0  \ntotal = 0  \n  \nfor data in valid_dataloader:  \n    images,labels = data  \n    images = images.cuda()\n    labels = labels.cuda()\n    outputs = net(Variable(images)).cuda()  \n    _,predicted = torch.max(outputs.data,1)  \n    total += labels.size(0)  \n    correct += (predicted == labels).sum()  \n  \n\nprint('Accuracy of the network on the 5000 test images: %d %%' % (100 * correct / total))  ","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"536ffed6-7b0a-418a-9c2b-7210b6be7c9f","_uuid":"56e473d8c76224b4f83850b9d5a5c657c118efed","collapsed":true,"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}