项目文件夹

文件
2019-03-19 16:31:10 +08:00

291 行
8.6 KiB
Plaintext

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 5.6 深度卷积神经网络(AlexNet"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:45.657048Z",
"start_time": "2019-03-19T07:36:45.285668Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.4.0\n",
"0.2.1\n",
"cuda\n"
]
}
],
"source": [
"import time\n",
"import torch\n",
"from torch import nn, optim\n",
"import torchvision\n",
"\n",
"import sys\n",
"sys.path.append(\"..\") \n",
"import d2lzh_pytorch as d2l\n",
"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
"\n",
"print(torch.__version__)\n",
"print(torchvision.__version__)\n",
"print(device)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.6.2 AlexNet"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:45.703036Z",
"start_time": "2019-03-19T07:36:45.658231Z"
}
},
"outputs": [],
"source": [
"class AlexNet(nn.Module):\n",
" def __init__(self):\n",
" super(AlexNet, self).__init__()\n",
" self.conv = nn.Sequential(\n",
" nn.Conv2d(1, 96, 11, 4), # in_channels, out_channels, kernel_size, stride, padding\n",
" nn.ReLU(),\n",
" nn.MaxPool2d(3, 2), # kernel_size, stride\n",
" # 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数\n",
" nn.Conv2d(96, 256, 5, 1, 2),\n",
" nn.ReLU(),\n",
" nn.MaxPool2d(3, 2),\n",
" # 连续3个卷积层,且使用更小的卷积窗口。除了最后的卷积层外,进一步增大了输出通道数。\n",
" # 前两个卷积层后不使用池化层来减小输入的高和宽\n",
" nn.Conv2d(256, 384, 3, 1, 1),\n",
" nn.ReLU(),\n",
" nn.Conv2d(384, 384, 3, 1, 1),\n",
" nn.ReLU(),\n",
" nn.Conv2d(384, 256, 3, 1, 1),\n",
" nn.ReLU(),\n",
" nn.MaxPool2d(3, 2)\n",
" )\n",
" # 这里全连接层的输出个数比LeNet中的大数倍。使用丢弃层来缓解过拟合\n",
" self.fc = nn.Sequential(\n",
" nn.Linear(256*5*5, 4096),\n",
" nn.ReLU(),\n",
" nn.Dropout(0.5),\n",
" nn.Linear(4096, 4096),\n",
" nn.ReLU(),\n",
" nn.Dropout(0.5),\n",
" # 输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000\n",
" nn.Linear(4096, 10),\n",
" )\n",
"\n",
" def forward(self, img):\n",
" feature = self.conv(img)\n",
" output = self.fc(feature.view(img.shape[0], -1))\n",
" return output"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:46.053598Z",
"start_time": "2019-03-19T07:36:45.704356Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AlexNet(\n",
" (conv): Sequential(\n",
" (0): Conv2d(1, 96, kernel_size=(11, 11), stride=(4, 4))\n",
" (1): ReLU()\n",
" (2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" (3): Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
" (4): ReLU()\n",
" (5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" (6): Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (7): ReLU()\n",
" (8): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (9): ReLU()\n",
" (10): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
" (11): ReLU()\n",
" (12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
" )\n",
" (fc): Sequential(\n",
" (0): Linear(in_features=6400, out_features=4096, bias=True)\n",
" (1): ReLU()\n",
" (2): Dropout(p=0.5)\n",
" (3): Linear(in_features=4096, out_features=4096, bias=True)\n",
" (4): ReLU()\n",
" (5): Dropout(p=0.5)\n",
" (6): Linear(in_features=4096, out_features=10, bias=True)\n",
" )\n",
")\n"
]
}
],
"source": [
"net = AlexNet()\n",
"print(net)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.6.3 读取数据"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:46.066761Z",
"start_time": "2019-03-19T07:36:46.054928Z"
}
},
"outputs": [],
"source": [
"# 本函数已保存在d2lzh_pytorch包中方便以后使用\n",
"def load_data_fashion_mnist(batch_size, resize=None, root='~/Datasets/FashionMNIST'):\n",
" \"\"\"Download the fashion mnist dataset and then load into memory.\"\"\"\n",
" trans = []\n",
" if resize:\n",
" trans.append(torchvision.transforms.Resize(size=resize))\n",
" trans.append(torchvision.transforms.ToTensor())\n",
" \n",
" transform = torchvision.transforms.Compose(trans)\n",
" mnist_train = torchvision.datasets.FashionMNIST(root=root, train=True, download=True, transform=transform)\n",
" mnist_test = torchvision.datasets.FashionMNIST(root=root, train=False, download=True, transform=transform)\n",
"\n",
" train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=4)\n",
" test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=4)\n",
"\n",
" return train_iter, test_iter"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:46.091524Z",
"start_time": "2019-03-19T07:36:46.067835Z"
}
},
"outputs": [],
"source": [
"batch_size = 128\n",
"# 如出现“out of memory”的报错信息,可减小batch_size或resize\n",
"train_iter, test_iter = load_data_fashion_mnist(batch_size, resize=224)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5.6.4 训练"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2019-03-19T07:36:47.850402Z",
"start_time": "2019-03-19T07:36:46.092485Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"training on cuda\n",
"epoch 1, loss 0.0047, train acc 0.770, test acc 0.865, time 128.3 sec\n",
"epoch 2, loss 0.0025, train acc 0.879, test acc 0.889, time 128.8 sec\n",
"epoch 3, loss 0.0022, train acc 0.898, test acc 0.901, time 130.4 sec\n",
"epoch 4, loss 0.0019, train acc 0.908, test acc 0.900, time 131.4 sec\n",
"epoch 5, loss 0.0018, train acc 0.913, test acc 0.902, time 129.9 sec\n"
]
}
],
"source": [
"lr, num_epochs = 0.001, 5\n",
"optimizer = torch.optim.Adam(net.parameters(), lr=lr)\n",
"d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [default]",
"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.4"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}