{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!mkdir ./dogs-vs-cats\n!mkdir ./dogs-vs-cats-redux-kernels-edition\n!unzip  -o ../input/dogs-vs-cats/test1.zip -d ./dogs-vs-cats >a.txt\n!unzip  -o ../input/dogs-vs-cats/train.zip -d ./dogs-vs-cats >a.txt\n!unzip  -o ../input/dogs-vs-cats-redux-kernels-edition/train.zip -d ./dogs-vs-cats-redux-kernels-edition>a.txt\n!unzip  -o ../input/dogs-vs-cats-redux-kernels-edition/test.zip -d ./dogs-vs-cats-redux-kernels-edition >a.txt","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:13:04.230300Z","iopub.execute_input":"2021-10-18T14:13:04.230545Z","iopub.status.idle":"2021-10-18T14:13:36.764592Z","shell.execute_reply.started":"2021-10-18T14:13:04.230509Z","shell.execute_reply":"2021-10-18T14:13:36.763602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader, random_split\nimport torchvision.transforms as transforms\nimport torch.optim as optim\nimport torchvision.models as models\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nfrom sklearn.metrics import recall_score\nfrom sklearn.metrics import precision_score\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.metrics import f1_score\nfrom transformers import AdamW\nfrom tqdm import tqdm, trange\nfrom PIL import Image\nfrom sklearn.datasets import load_sample_image\nfrom sklearn.feature_extraction import image","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:13:36.771463Z","iopub.execute_input":"2021-10-18T14:13:36.772411Z","iopub.status.idle":"2021-10-18T14:13:36.782958Z","shell.execute_reply.started":"2021-10-18T14:13:36.772367Z","shell.execute_reply":"2021-10-18T14:13:36.782231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainLabel=[]\ntrianImagePaths=[]\nfor dirname, _, filenames in os.walk('./dogs-vs-cats/train'):\n    for filename in filenames:\n        trianImagePaths.append(os.path.join(dirname, filename))\n        if filename.split('.')[0]=='cat':\n            trainLabel.append(0)\n        else:\n            trainLabel.append(1)","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:13:43.304383Z","iopub.execute_input":"2021-10-18T14:13:43.304932Z","iopub.status.idle":"2021-10-18T14:13:43.401732Z","shell.execute_reply.started":"2021-10-18T14:13:43.304893Z","shell.execute_reply":"2021-10-18T14:13:43.401064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nx_train,x_test, y_train, y_test = train_test_split(trianImagePaths,trainLabel,test_size=0.3, random_state=0)","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:13:46.662039Z","iopub.execute_input":"2021-10-18T14:13:46.662586Z","iopub.status.idle":"2021-10-18T14:13:46.694542Z","shell.execute_reply.started":"2021-10-18T14:13:46.662547Z","shell.execute_reply":"2021-10-18T14:13:46.693873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DogsvsCats(Dataset):\n    def __init__(self, imgDirList, labels=None, transform_apply=None, iftrain=True):\n        self.imgDirList = imgDirList\n        self.transform = transform_apply\n        self.train = iftrain\n        self.labels=labels\n    def __len__(self):\n        return len(self.imgDirList)\n    \n    def __getitem__(self, index):\n        img = Image.open(self.imgDirList[index])\n        if self.transform:\n            img = self.transform(img)\n        #print(img.shape)\n        x=image.extract_patches_2d(np.transpose(img.numpy(), (1, 2, 0)) , (16, 16),max_patches=14*14)\n        #print(x.shape)\n        x=torch.tensor(x).reshape(-1,16*16*3)\n        if self.train:\n            label = torch.tensor(self.labels[index])\n            return x,label\n        else:\n            return x","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:42:37.742241Z","iopub.execute_input":"2021-10-18T14:42:37.742716Z","iopub.status.idle":"2021-10-18T14:42:37.750102Z","shell.execute_reply.started":"2021-10-18T14:42:37.742660Z","shell.execute_reply":"2021-10-18T14:42:37.749147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transforms = transforms.Compose([\n    transforms.Resize((224,224)),\n    transforms.RandomHorizontalFlip(0.5),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.4884, 0.4551, 0.4170], std=[0.2256, 0.2210, 0.2214])\n])\n\nval_transforms = transforms.Compose([\n    transforms.Resize((224,224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.4884, 0.4551, 0.4170], std=[0.2256, 0.2210, 0.2214])\n])","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:16:12.884954Z","iopub.execute_input":"2021-10-18T14:16:12.885247Z","iopub.status.idle":"2021-10-18T14:16:12.891138Z","shell.execute_reply.started":"2021-10-18T14:16:12.885216Z","shell.execute_reply":"2021-10-18T14:16:12.890372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = DogsvsCats(x_train,labels=y_train, transform_apply=train_transforms)\nval_dataset = DogsvsCats(x_test,labels=y_test, transform_apply=val_transforms)\n\ntrain_loader = torch.utils.data.DataLoader(train_dataset,batch_size=32,shuffle=True)\nval_loader = torch.utils.data.DataLoader(val_dataset,batch_size=32,shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:42:42.248030Z","iopub.execute_input":"2021-10-18T14:42:42.248567Z","iopub.status.idle":"2021-10-18T14:42:42.254166Z","shell.execute_reply.started":"2021-10-18T14:42:42.248529Z","shell.execute_reply":"2021-10-18T14:42:42.253075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class myRNN(nn.Module):\n    def __init__(self,MAX_LEN):\n        super(myRNN, self).__init__()\n        self.hidden_size=16*16*3\n        self.LSTM=nn.LSTM(self.hidden_size,self.hidden_size, 2,batch_first=True)\n        #self.RNN=nn.RNN(4,self.hidden_size, 2,batch_first=True)\n        self.dropout = nn.Dropout(0.1)\n        self.classifier = nn.Linear(self.hidden_size, 2)\n    def forward(self,x):\n        h0 = torch.zeros(2, x.shape[0],self.hidden_size).to(device)\n        c0 = torch.zeros(2, x.shape[0],self.hidden_size).to(device)\n        output, hn= self.LSTM(x,(h0,c0))\n        sequence_output = output[:,-1,:].view(-1, self.hidden_size)\n        sequence_output = self.dropout(sequence_output)\n        logits = self.classifier(sequence_output)\n        return logits","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:47:35.878951Z","iopub.execute_input":"2021-10-18T14:47:35.879530Z","iopub.status.idle":"2021-10-18T14:47:35.889864Z","shell.execute_reply.started":"2021-10-18T14:47:35.879492Z","shell.execute_reply":"2021-10-18T14:47:35.889017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\nmodel= myRNN(MAX_LEN=14*14)\nmodel.to(device)\n# 损失函数\ncriteon = nn.CrossEntropyLoss()\n# 优化器\noptimizer = AdamW(model.parameters(),lr=3e-5,eps=1e-8)","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:47:35.891792Z","iopub.execute_input":"2021-10-18T14:47:35.892380Z","iopub.status.idle":"2021-10-18T14:47:35.978471Z","shell.execute_reply.started":"2021-10-18T14:47:35.892342Z","shell.execute_reply":"2021-10-18T14:47:35.977814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def doEval(model,valid_dataloader):\n    model.eval()\n    eval_loss=0\n    predictions, true_labels = [], []\n    for batch in valid_dataloader:\n        batch = tuple(t.to(device) for t in batch)\n        data, label = batch\n        with torch.no_grad():\n            outputs = model(data)\n            \n        predictions.extend(torch.argmax(outputs, dim=-1))\n        \n        label_ids = label.to('cpu').numpy()\n        true_labels.extend(label_ids)\n        \n        eval_loss += criteon(outputs, label).mean().item()\n    eval_loss = eval_loss / len(valid_dataloader)\n    rue_labels,predictions=torch.tensor(true_labels),torch.tensor(predictions)\n    acc = accuracy_score(true_labels,predictions)\n    f1 = f1_score(true_labels,predictions)\n    recall = recall_score(true_labels,predictions)\n    precision=precision_score(true_labels,predictions)\n    return acc,precision,recall,f1,eval_loss","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:47:35.979553Z","iopub.execute_input":"2021-10-18T14:47:35.979818Z","iopub.status.idle":"2021-10-18T14:47:35.990144Z","shell.execute_reply.started":"2021-10-18T14:47:35.979783Z","shell.execute_reply":"2021-10-18T14:47:35.989241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def doTrain(model,train_loader):\n    model.train()\n    total_loss = 0\n    predictions, true_labels = [], []\n    for batch in train_loader:\n        optimizer.zero_grad()\n        batch = tuple(t.to(device) for t in batch)\n        data, label = batch\n        outputs = model(data)\n        loss=criteon(outputs, label).mean()\n        loss.backward()\n        total_loss += loss.item()\n        optimizer.step()\n        predictions.extend(torch.argmax(outputs, dim=-1))\n        label_ids = label.to('cpu').numpy()\n        true_labels.extend(label_ids)\n    train_loss = total_loss / len(train_loader)\n    rue_labels,predictions=torch.tensor(true_labels),torch.tensor(predictions)\n    acc = accuracy_score(true_labels,predictions)\n    f1 = f1_score(true_labels,predictions)\n    recall = recall_score(true_labels,predictions)\n    precision=precision_score(true_labels,predictions)\n    return acc,precision,recall,f1,train_loss","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:47:35.991262Z","iopub.execute_input":"2021-10-18T14:47:35.991563Z","iopub.status.idle":"2021-10-18T14:47:36.002365Z","shell.execute_reply.started":"2021-10-18T14:47:35.991528Z","shell.execute_reply":"2021-10-18T14:47:36.001564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc_eva = []\nf1_eva = []\nrecall_eva = []\nprecision_eva=[]\n\nacc_train = []\nf1_train = []\nrecall_train = []\nprecision_train=[]\n\nloss_train=[]\nloss_eva=[]\n## Store the average loss after each epoch so we can plot them.\nfor _ in trange(20, desc=\"Epoch\"):\n    acc,precision,recall,f1,train_loss=doTrain(model,train_loader)\n    acc_train.append(acc)\n    f1_train.append(f1)\n    recall_train.append(recall)\n    precision_train.append(precision)\n    loss_train.append(train_loss)\n    print(\"Train Accuracy-Score: {}\".format(acc))\n    print(\"Train F1-Score: {}\".format(f1))\n    print(\"Train recall-Score: {}\".format(recall))\n    print(\"Train precision-Score: {}\".format(precision))\n    print(\"Average Train loss: {}\".format(train_loss))\n    print()\n    \n    acc,precision,recall,f1,eval_loss=doEval(model,val_loader)\n    acc_eva.append(acc)\n    f1_eva.append(f1)\n    recall_eva.append(recall)\n    precision_eva.append(precision)\n    loss_eva.append(eval_loss)\n    print(\"Validation Accuracy-Score: {}\".format(acc))\n    print(\"Validation F1-Score: {}\".format(f1))\n    print(\"Validation recall-Score: {}\".format(recall))\n    print(\"Validation precision-Score: {}\".format(precision))\n    print(\"Average Validation loss: {}\".format(eval_loss))\n    print()","metadata":{"execution":{"iopub.status.busy":"2021-10-18T14:47:36.004882Z","iopub.execute_input":"2021-10-18T14:47:36.005315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nimport seaborn as sns\n\n# Use plot styling from seaborn.\nsns.set(style='darkgrid')\n\n# Increase the plot size and font size.\nsns.set(font_scale=1.5)\nplt.rcParams[\"figure.figsize\"] = (12,6)\n\n# Plot the learning curve.\nplt.plot(loss_train, '-o', label=\"training loss\")\nplt.plot(loss_eva, '-o', label=\"validation loss\")\n# Label the plot.\nplt.title(\"Learning curve\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nimport seaborn as sns\nsns.set(style='darkgrid')\nsns.set(font_scale=1.5)\nplt.rcParams[\"figure.figsize\"] = (12,6)\nplt.plot(acc_eva, 'b-o', label=\"evalation\")\nplt.plot(acc_train, 'r-o', label=\"target train\")\nplt.title(\"Acc curve\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"acc\")\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nimport seaborn as sns\nsns.set(style='darkgrid')\nsns.set(font_scale=1.5)\nplt.rcParams[\"figure.figsize\"] = (12,6)\nplt.plot(f1_eva, 'b-o', label=\"evalation\")\nplt.plot(f1_train, 'r-o', label=\"target train\")\nplt.title(\"F1 curve\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"f1\")\nplt.legend()\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nimport seaborn as sns\nsns.set(style='darkgrid')\nsns.set(font_scale=1.5)\nplt.rcParams[\"figure.figsize\"] = (12,6)\nplt.plot(recall_eva, 'b-o', label=\"evalation\")\nplt.plot(recall_train, 'r-o', label=\"target train\")\nplt.title(\"recall curve\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"recall\")\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nimport seaborn as sns\nsns.set(style='darkgrid')\nsns.set(font_scale=1.5)\nplt.rcParams[\"figure.figsize\"] = (12,6)\nplt.plot(precision_eva, 'b-o', label=\"evalation\")\nplt.plot(precision_train, 'r-o', label=\"target train\")\nplt.title(\"precision curve\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"precision\")\nplt.legend()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}