Created
June 7, 2018 12:46
-
-
Save libfun/fff8bcf5e3916d49c63d9c704910552b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"%matplotlib inline\n", | |
"from tqdm import tqdm, tqdm_notebook\n", | |
"import os\n", | |
"from sklearn.datasets import load_digits\n", | |
"%config InlineBackend.figure_format = 'retina'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mnist_data = load_digits()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mnist_data.keys()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mnist_data.data[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.figure(figsize=(12, 5))\n", | |
"for i in range(10):\n", | |
" plt.subplot(1, 10, i + 1)\n", | |
" plt.imshow(mnist_data.data[i].reshape(8, 8), cmap='gray')\n", | |
" plt.axis('off')\n", | |
"plt.show();" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.linear_model import LogisticRegression\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"from sklearn.metrics import accuracy_score" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train, X_test, y_train, y_test = train_test_split(mnist_data.data, mnist_data.target, test_size=.2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train.shape, X_test.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"cls = LogisticRegression()\n", | |
"cls.fit(X_train, y_train)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"preds = cls.predict(X_test)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"accuracy_score(y_test, preds)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"from torch import nn" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class ShallowNet(nn.Module):\n", | |
" def __init__(self):\n", | |
" super().__init__()\n", | |
" self.first_layer = nn.Linear(in_features=64, out_features=16)\n", | |
" self.second_layer = nn.Linear(in_features=16, out_features=10)\n", | |
" self.output_layer = nn.Softmax(dim=-1)\n", | |
" \n", | |
" def forward(self, x):\n", | |
" out = self.first_layer(x)\n", | |
" out = self.second_layer(out)\n", | |
" return self.output_layer(out)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = ShallowNet()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"print(net)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train_tensor = torch.from_numpy(X_train).to(dtype=torch.float32)\n", | |
"X_test_tensor = torch.from_numpy(X_test).to(dtype=torch.float32)\n", | |
"y_train_tensor = torch.from_numpy(y_train)\n", | |
"y_test_tensor = torch.from_numpy(y_test)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"out = net(X_train_tensor)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pred = out.data.numpy().argmax(axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"accuracy_score(y_train, pred)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = ShallowNet()\n", | |
"criterion = nn.CrossEntropyLoss()\n", | |
"optimizer = torch.optim.Adam(net.parameters())\n", | |
"\n", | |
"losses_train = []\n", | |
"losses_test = []\n", | |
"accs_train = []\n", | |
"accs_test = []\n", | |
"\n", | |
"epoch = 1\n", | |
"max_epoch = 200\n", | |
"for i in range(max_epoch):\n", | |
" optimizer.zero_grad()\n", | |
" out = net(X_train_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, y_train_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" out_test = net(X_test_tensor)\n", | |
" losses_train.append(loss_value)\n", | |
" losses_test.append(criterion(out_test, y_test_tensor).data.numpy())\n", | |
" accs_train.append(accuracy_score(y_train, pred))\n", | |
" accs_test.append(accuracy_score(out_test.data.numpy().argmax(axis=1), y_test))\n", | |
" if i % 10 == 0:\n", | |
" print('Epoch[{}]: train_loss {:.5f} train_accuracy {:.5f} | test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, losses_train[-1], accs_train[-1], \n", | |
" losses_test[-1], accs_train[-1]))\n", | |
" epoch += 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.plot(list(range(max_epoch)), losses_train, label='train loss')\n", | |
"plt.plot(list(range(max_epoch)), losses_test, label='test loss')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();\n", | |
"plt.plot(list(range(max_epoch)), accs_train, label='train accuracy')\n", | |
"plt.plot(list(range(max_epoch)), accs_test, label='test accuracy')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from torch.utils.data import TensorDataset, DataLoader" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"train_loader = DataLoader(TensorDataset(X_train_tensor, y_train_tensor), batch_size=16, shuffle=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = ShallowNet()\n", | |
"criterion = nn.CrossEntropyLoss()\n", | |
"optimizer = torch.optim.Adam(net.parameters())\n", | |
"\n", | |
"losses_train = []\n", | |
"losses_test = []\n", | |
"accs_train = []\n", | |
"accs_test = []\n", | |
"\n", | |
"epoch = 1\n", | |
"max_epoch = 200\n", | |
"for i in range(max_epoch):\n", | |
" tmp_train_loss = []\n", | |
" tmp_train_acc = []\n", | |
" for batch in train_loader:\n", | |
" optimizer.zero_grad()\n", | |
" in_tensor = batch[0]\n", | |
" target_tensor = batch[1]\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" tmp_train_loss.append(loss_value)\n", | |
" tmp_train_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" out_test = net(X_test_tensor)\n", | |
" losses_train.append(np.mean(tmp_train_loss))\n", | |
" losses_test.append(criterion(out_test, y_test_tensor).data.numpy())\n", | |
" accs_train.append(np.mean(tmp_train_acc))\n", | |
" accs_test.append(accuracy_score(out_test.data.numpy().argmax(axis=1), y_test))\n", | |
" if i % 10 == 0:\n", | |
" print('Epoch[{}]: train_loss {:.5f} train_accuracy {:.5f} | test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, losses_train[-1], accs_train[-1], \n", | |
" losses_test[-1], accs_test[-1]))\n", | |
" epoch += 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.plot(list(range(max_epoch)), losses_train, label='train loss')\n", | |
"plt.plot(list(range(max_epoch)), losses_test, label='test loss')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();\n", | |
"plt.plot(list(range(max_epoch)), accs_train, label='train accuracy')\n", | |
"plt.plot(list(range(max_epoch)), accs_test, label='test accuracy')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class DeepNet(nn.Module):\n", | |
" def __init__(self):\n", | |
" super().__init__()\n", | |
" self.network = nn.Sequential(\n", | |
" nn.Linear(64, 32),\n", | |
" nn.ReLU(32),\n", | |
" nn.Linear(32, 16),\n", | |
" nn.ReLU(16),\n", | |
" nn.Linear(16, 10),\n", | |
" nn.Softmax(dim=-1)\n", | |
" )\n", | |
" \n", | |
" def forward(self, x):\n", | |
" return self.network(x)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = DeepNet()\n", | |
"print(net)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = DeepNet()\n", | |
"criterion = nn.CrossEntropyLoss()\n", | |
"optimizer = torch.optim.Adam(net.parameters())\n", | |
"\n", | |
"losses_train = []\n", | |
"losses_test = []\n", | |
"accs_train = []\n", | |
"accs_test = []\n", | |
"\n", | |
"epoch = 1\n", | |
"max_epoch = 200\n", | |
"for i in range(max_epoch):\n", | |
" tmp_train_loss = []\n", | |
" tmp_train_acc = []\n", | |
" for batch in train_loader:\n", | |
" optimizer.zero_grad()\n", | |
" in_tensor = batch[0]\n", | |
" target_tensor = batch[1]\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" tmp_train_loss.append(loss_value)\n", | |
" tmp_train_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" out_test = net(X_test_tensor)\n", | |
" losses_train.append(np.mean(tmp_train_loss))\n", | |
" losses_test.append(criterion(out_test, y_test_tensor).data.numpy())\n", | |
" accs_train.append(np.mean(tmp_train_acc))\n", | |
" accs_test.append(accuracy_score(out_test.data.numpy().argmax(axis=1), y_test))\n", | |
" if i % 10 == 0:\n", | |
" print('Epoch[{}]: train_loss {:.5f} train_accuracy {:.5f} | test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, losses_train[-1], accs_train[-1], \n", | |
" losses_test[-1], accs_test[-1]))\n", | |
" epoch += 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.plot(list(range(max_epoch)), losses_train, label='train loss')\n", | |
"plt.plot(list(range(max_epoch)), losses_test, label='test loss')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();\n", | |
"plt.plot(list(range(max_epoch)), accs_train, label='train accuracy')\n", | |
"plt.plot(list(range(max_epoch)), accs_test, label='test accuracy')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class ConvNet(nn.Module):\n", | |
" def __init__(self):\n", | |
" super().__init__()\n", | |
" self.network = nn.Sequential(\n", | |
" nn.Conv2d(1, 8, kernel_size=3, padding=1),\n", | |
" nn.ReLU(8),\n", | |
" nn.MaxPool2d(2),\n", | |
" nn.Conv2d(8, 16, kernel_size=3, padding=1),\n", | |
" nn.ReLU(16),\n", | |
" nn.MaxPool2d(2),\n", | |
" nn.Conv2d(16, 32, kernel_size=2),\n", | |
" nn.ReLU(32)\n", | |
" )\n", | |
" self.linear = nn.Linear(32, 10)\n", | |
" self.output_layer = nn.Softmax(dim=-1)\n", | |
" \n", | |
" def forward(self, x):\n", | |
" out = self.network(x)\n", | |
" out = self.linear(out.view(-1, 32))\n", | |
" return self.output_layer(out)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = ConvNet()\n", | |
"print(net)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train_tensor = torch.from_numpy(X_train.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"X_test_tensor = torch.from_numpy(X_test.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"train_loader = DataLoader(TensorDataset(X_train_tensor, y_train_tensor), batch_size=16, shuffle=True)\n", | |
"\n", | |
"net = ConvNet()\n", | |
"criterion = nn.CrossEntropyLoss()\n", | |
"optimizer = torch.optim.Adam(net.parameters())\n", | |
"\n", | |
"losses_train = []\n", | |
"losses_test = []\n", | |
"accs_train = []\n", | |
"accs_test = []\n", | |
"\n", | |
"epoch = 1\n", | |
"max_epoch = 50\n", | |
"for i in range(max_epoch):\n", | |
" tmp_train_loss = []\n", | |
" tmp_train_acc = []\n", | |
" for batch in train_loader:\n", | |
" optimizer.zero_grad()\n", | |
" in_tensor = batch[0]\n", | |
" target_tensor = batch[1]\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" tmp_train_loss.append(loss_value)\n", | |
" tmp_train_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" out_test = net(X_test_tensor)\n", | |
" losses_train.append(np.mean(tmp_train_loss))\n", | |
" losses_test.append(criterion(out_test, y_test_tensor).data.numpy())\n", | |
" accs_train.append(np.mean(tmp_train_acc))\n", | |
" accs_test.append(accuracy_score(out_test.data.numpy().argmax(axis=1), y_test))\n", | |
" if i % 10 == 0:\n", | |
" print('Epoch[{}]: train_loss {:.5f} train_accuracy {:.5f} | test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, losses_train[-1], accs_train[-1], \n", | |
" losses_test[-1], accs_test[-1]))\n", | |
" epoch += 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"plt.plot(list(range(max_epoch)), losses_train, label='train loss')\n", | |
"plt.plot(list(range(max_epoch)), losses_test, label='test loss')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();\n", | |
"plt.plot(list(range(max_epoch)), accs_train, label='train accuracy')\n", | |
"plt.plot(list(range(max_epoch)), accs_test, label='test accuracy')\n", | |
"plt.legend(loc='best')\n", | |
"plt.show();" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"from PIL import Image" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from torchvision.datasets import ImageFolder, DatasetFolder\n", | |
"from torch.utils.data import Dataset\n", | |
"from torchvision import transforms" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class CatsAndDogs(Dataset):\n", | |
" def __init__(self, path, transform):\n", | |
" super().__init__()\n", | |
" self.path = path\n", | |
" self.images = sorted(os.listdir(path))\n", | |
" self.images = np.array(self.images)[[i.endswith('jpg') for i in self.images]]\n", | |
" self.transform = transform\n", | |
" \n", | |
" def __getitem__(self, item):\n", | |
" imgpath = os.path.join(self.path, self.images[item])\n", | |
" target = imgpath.split('/')[-1].split('.')[0]\n", | |
" if target == 'cat':\n", | |
" target = torch.tensor(0.0)\n", | |
" else:\n", | |
" target = torch.tensor(1.0)\n", | |
" img = Image.open(imgpath)\n", | |
" return {'image': self.transform(img), \n", | |
" 'label': target}\n", | |
" \n", | |
" def __len__(self):\n", | |
" return len(self.images)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"train_loader = DataLoader(CatsAndDogs('/Users/libfun/tmp/dl_pres/data/train_small/',\n", | |
" transforms.Compose([\n", | |
" transforms.Resize(224),\n", | |
" transforms.CenterCrop(224),\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize([.5, .5, .5], \n", | |
" [.5, .5, .5])\n", | |
" ])), batch_size=16, shuffle=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"for i in train_loader:\n", | |
" img = i['image'].data.numpy()[0].transpose(1, 2, 0)\n", | |
" img /= 2.\n", | |
" img += .5\n", | |
" plt.imshow(img);\n", | |
" print(i['label'][0])\n", | |
" break" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class ConvNet(nn.Module):\n", | |
" def __init__(self, num_ch=4):\n", | |
" super().__init__()\n", | |
" self.num_ch = num_ch\n", | |
" self.network = nn.Sequential( # 224\n", | |
" nn.Conv2d(3, self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(self.num_ch),\n", | |
" nn.MaxPool2d(2), # 112\n", | |
" nn.Conv2d(self.num_ch, 2 * self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(2 * self.num_ch),\n", | |
" nn.MaxPool2d(2), # 56\n", | |
" nn.Conv2d(2 * self.num_ch, 4 * self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(4 * self.num_ch),\n", | |
" nn.MaxPool2d(2), # 28\n", | |
" nn.Conv2d(4 * self.num_ch, 8 * self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(8 * self.num_ch),\n", | |
" nn.MaxPool2d(2), # 14\n", | |
" nn.Conv2d(8 * self.num_ch, 16 * self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(16 * self.num_ch),\n", | |
" nn.MaxPool2d(2), # 7\n", | |
" nn.Conv2d(16 * self.num_ch, 32 * self.num_ch, kernel_size=3, padding=1),\n", | |
" nn.ReLU(32 * self.num_ch),\n", | |
" nn.AvgPool2d(7)\n", | |
" )\n", | |
" self.linear = nn.Linear(32 * self.num_ch, 1)\n", | |
" self.output_layer = nn.Sigmoid()\n", | |
" \n", | |
" def forward(self, x):\n", | |
" out = self.network(x)\n", | |
" out = self.linear(out.view(-1, 32 * self.num_ch))\n", | |
" return self.output_layer(out)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train_tensor = torch.from_numpy(X_train.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"X_test_tensor = torch.from_numpy(X_test.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"# train_loader = DataLoader(TensorDataset(X_train_tensor, y_train_tensor), batch_size=16, shuffle=True)\n", | |
"train_loader = DataLoader(CatsAndDogs('/Users/libfun/tmp/dl_pres/data/train_small/',\n", | |
" transforms.Compose([\n", | |
" transforms.Resize(224),\n", | |
" transforms.RandomCrop(224),\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize([.5, .5, .5], \n", | |
" [.5, .5, .5])\n", | |
" ])), batch_size=16, shuffle=True)\n", | |
"\n", | |
"val_loader = DataLoader(CatsAndDogs('/Users/libfun/tmp/dl_pres/data/val_small/',\n", | |
" transforms.Compose([\n", | |
" transforms.Resize(224),\n", | |
" transforms.CenterCrop(224),\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize([.5, .5, .5], \n", | |
" [.5, .5, .5])\n", | |
" ])), batch_size=1, shuffle=False)\n", | |
"\n", | |
"net = ConvNet()\n", | |
"criterion = nn.BCELoss()\n", | |
"optimizer = torch.optim.Adam(net.parameters())\n", | |
"\n", | |
"losses_train = []\n", | |
"losses_test = []\n", | |
"accs_train = []\n", | |
"accs_test = []\n", | |
"\n", | |
"epoch = 1\n", | |
"iteration = 0\n", | |
"for i in range(30):\n", | |
" log_loss = []\n", | |
" log_acc = []\n", | |
" for batch in tqdm_notebook(train_loader):\n", | |
" optimizer.zero_grad()\n", | |
" in_tensor = batch['image']\n", | |
" target_tensor = batch['label'].view(-1, 1)\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" log_loss.append(loss_value)\n", | |
" log_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" if iteration % 50 == 0:\n", | |
" log_test_loss = []\n", | |
" log_test_acc = []\n", | |
" for batch in val_loader:\n", | |
" in_tensor = batch['image']\n", | |
" target_tensor = batch['label'].view(-1, 1)\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" log_test_loss.append(loss.data.numpy())\n", | |
" log_test_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" print('Epoch[{}]: test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, np.mean(log_test_loss), np.mean(log_test_acc)))\n", | |
" iteration += 1\n", | |
" epoch += 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from torchvision.models import resnet18" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net = resnet18(pretrained=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"print(net)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"net.fc = nn.Sequential(\n", | |
" nn.Linear(in_features=512, out_features=1),\n", | |
" nn.Sigmoid())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train_tensor = torch.from_numpy(X_train.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"X_test_tensor = torch.from_numpy(X_test.reshape(-1, 1, 8, 8)).to(dtype=torch.float32)\n", | |
"# train_loader = DataLoader(TensorDataset(X_train_tensor, y_train_tensor), batch_size=16, shuffle=True)\n", | |
"train_loader = DataLoader(CatsAndDogs('/Users/libfun/tmp/dl_pres/data/train_small/',\n", | |
" transforms.Compose([\n", | |
" transforms.Resize(224),\n", | |
" transforms.CenterCrop(224),\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize([.5, .5, .5], \n", | |
" [.5, .5, .5])\n", | |
" ])), batch_size=16, shuffle=True)\n", | |
"\n", | |
"val_loader = DataLoader(CatsAndDogs('/Users/libfun/tmp/dl_pres/data/val_small/',\n", | |
" transforms.Compose([\n", | |
" transforms.Resize(224),\n", | |
" transforms.CenterCrop(224),\n", | |
" transforms.ToTensor(),\n", | |
" transforms.Normalize([.5, .5, .5], \n", | |
" [.5, .5, .5])\n", | |
" ])), batch_size=1, shuffle=False)\n", | |
"\n", | |
"# net = ConvNet()\n", | |
"criterion = nn.BCELoss()\n", | |
"optimizer = torch.optim.Adam(net.fc.parameters())\n", | |
"is_training = True\n", | |
"epoch = 1\n", | |
"iteration = 0\n", | |
"for i in range(30):\n", | |
" log_loss = []\n", | |
" log_acc = []\n", | |
" for batch in tqdm_notebook(train_loader):\n", | |
" optimizer.zero_grad()\n", | |
" in_tensor = batch['image']\n", | |
" target_tensor = batch['label'].view(-1, 1)\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" loss_value = loss.data.numpy()\n", | |
" log_loss.append(loss_value)\n", | |
" log_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" if iteration % 50 == 0:\n", | |
" # print('Epoch[{}]: train_loss {:.5f} train_accuracy {:.5f}'.format(\n", | |
" # epoch, np.mean(log_loss), np.mean(log_acc)))\n", | |
" log_test_loss = []\n", | |
" log_test_acc = []\n", | |
" for batch in val_loader:\n", | |
" in_tensor = batch['image']\n", | |
" target_tensor = batch['label'].view(-1, 1)\n", | |
" out = net(in_tensor)\n", | |
" pred = out.data.numpy().argmax(axis=1)\n", | |
" loss = criterion(out, target_tensor)\n", | |
" log_test_loss.append(loss.data.numpy())\n", | |
" log_test_acc.append(accuracy_score(target_tensor.data.numpy(), pred))\n", | |
" print('Epoch[{}]: test_loss {:.5f} test_accuracy {:.5f}'.format(\n", | |
" epoch, np.mean(log_test_loss), np.mean(log_test_acc)))\n", | |
" iteration += 1\n", | |
" epoch += 1" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment