{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport zipfile\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        \n# unzip        \nprint(os.getcwd())\nos.makedirs('data', exist_ok=True)\n\nwith zipfile.ZipFile('../input/dogs-vs-cats-redux-kernels-edition/train.zip') as train_zip:\n    train_zip.extractall('data')\n    \nwith zipfile.ZipFile('../input/dogs-vs-cats-redux-kernels-edition/test.zip') as test_zip:\n    test_zip.extractall('data')\n\n\n# show unzip dir\ntrain_dir = './data/train'\ntest_dir = './data/test'\n\nprint('len:', len(os.listdir(train_dir)), len(os.listdir(test_dir)))\nos.listdir(train_dir)[:5]\nos.listdir(test_dir)[:5]\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport glob\nimport os\nimport torch\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom torchvision import datasets, models, transforms\nimport torch.nn as nn\nimport torch.optim as optim\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 100\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(device)\n\ntorch.manual_seed(1234)\n\nif device =='cuda':\n    torch.cuda.manual_seed_all(1234)\n    \nlr = 0.001","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_list = glob.glob(os.path.join(train_dir,'*.jpg'))\ntest_list = glob.glob(os.path.join(test_dir, '*.jpg'))\n\nprint('show data:', len(train_list), train_list[:3])\nprint('show data:', len(test_list), test_list[:3])\n\n\nfig = plt.figure()\nax = fig.add_subplot(1,1,1)\nimg = Image.open(train_list[0])\nplt.imshow(img)\nplt.axis('off')\nplt.show()\nprint(type(img))\nimg_np = np.asarray(img)\nprint(img_np.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_list, val_list = train_test_split(train_list, test_size=0.2)\nprint(len(train_list), train_list[:3])\nprint(len(val_list), val_list[:3])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_transforms = transforms.Compose([\n    transforms.Resize((224, 224)),\n#     transforms.RandomCrop(224), \n    transforms.ToTensor(),\n])\n\nval_transforms = transforms.Compose([\n    transforms.Resize((224, 224)),\n#     transforms.RandomCrop(224), \n    transforms.ToTensor(),\n])\n\ntest_transforms = transforms.Compose([\n    transforms.Resize((224, 224)),\n#     transforms.RandomCrop(224), \n    transforms.ToTensor(),\n])\n\n\nclass dataset(torch.utils.data.Dataset):\n    def __init__(self,file_list,now_transform):\n        self.file_list = file_list # list of path\n        self.transform = now_transform\n    \n    def __len__(self):\n        self.filelength = len(self.file_list)\n        return self.filelength\n    \n    def __getitem__(self,idx):\n        img_path = self.file_list[idx]\n        img = Image.open(img_path)\n#         print(img.size)\n        img_transformed = self.transform(img)\n        \n        # test 没有标签?\n        label = img_path.split('/')[-1].split('.')[0]\n        if label == 'dog':\n            label=1\n        elif label == 'cat':\n            label=0\n        else:\n            assert False\n            \n        return img_transformed,label\n\n\ntrain_data = dataset(train_list, train_transforms)\nval_data = dataset(val_list, test_transforms)\n# test_data = dataset(test_list, transform=test_transforms)\n\ntrain_loader = torch.utils.data.DataLoader(dataset = train_data, batch_size=batch_size, shuffle=True )\nval_loader = torch.utils.data.DataLoader(dataset = val_data, batch_size=batch_size, shuffle=True)\n# test_loader = torch.utils.data.DataLoader(dataset = test_data, batch_size=batch_size, shuffle=True)\n\nprint(len(train_data), len(train_loader))\nprint(len(val_data), len(val_loader))\nprint(train_data, type(train_data))\nt1, t2 = train_data[7]\nprint(t1, t2)\nprint(type(t1))\nprint(t1.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CNN_STD(nn.Module):\n    def __init__(self):\n        super(CNN_STD,self).__init__()\n        \n        self.layer1 = nn.Sequential(\n            nn.Conv2d(3,16,kernel_size=3, padding=0,stride=2),\n            nn.BatchNorm2d(16),\n            nn.ReLU(),\n            nn.MaxPool2d(2)\n        )\n        \n        self.layer2 = nn.Sequential(\n            nn.Conv2d(16,32, kernel_size=3, padding=0, stride=2),\n            nn.BatchNorm2d(32),\n            nn.ReLU(),\n            nn.MaxPool2d(2)\n            )\n        \n        self.layer3 = nn.Sequential(\n            nn.Conv2d(32,64, kernel_size=3, padding=0, stride=2),\n            nn.BatchNorm2d(64),\n            nn.ReLU(),\n            nn.MaxPool2d(2)\n        )\n        \n        \n        self.fc1 = nn.Linear(3*3*64,10)\n        self.dropout = nn.Dropout(0.5)\n        self.fc2 = nn.Linear(10,2)\n        self.relu = nn.ReLU()\n        \n        \n    def forward(self,x):\n        out = self.layer1(x)\n        out = self.layer2(out)\n        out = self.layer3(out)\n        out = out.view(out.size(0),-1)\n        out = self.relu(self.fc1(out))\n        out = self.fc2(out)\n        return out","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = CNN_STD().to(device)\nmodel.train()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = optim.Adam(params = model.parameters(),lr=lr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"loss_f = nn.CrossEntropyLoss()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 10\n\nprint('start epoch iter, please wait...')\nfor epoch in range(epochs):\n    epoch_loss = 0\n    epoch_accuracy = 0\n    \n    for data, label in train_loader:\n        data = data.to(device)\n        label = label.to(device)\n        \n        output = model(data)\n        loss = loss_f(output, label)\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        acc = ((output.argmax(dim=1) == label).float().mean())\n        epoch_accuracy += acc/len(train_loader)\n        epoch_loss += loss/len(train_loader)\n    \n        \n    print('Epoch : {}, train accuracy : {}, train loss : {}'.format(epoch+1, epoch_accuracy,epoch_loss))\n    \n    \n    with torch.no_grad():\n        epoch_val_accuracy=0\n        epoch_val_loss =0\n        for data, label in val_loader:\n            data = data.to(device)\n            label = label.to(device)\n            \n            val_output = model(data)\n            val_loss = loss_f(val_output,label)\n            \n            \n            acc = ((val_output.argmax(dim=1) == label).float().mean())\n            epoch_val_accuracy += acc/ len(val_loader)\n            epoch_val_loss += val_loss/ len(val_loader)\n            \n        print('Epoch : {}, val_accuracy : {}, val_loss : {}'.format(epoch+1, epoch_val_accuracy,epoch_val_loss))","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}