You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
4.0 KiB

3 years ago
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3.9 多层感知机的从零开始实现"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.4.1\n"
]
}
],
"source": [
"import torch\n",
"import numpy as np\n",
"import sys\n",
"sys.path.append(\"..\") # 为了导入上层目录的d2lzh_pytorch\n",
"import d2lzh_pytorch as d2l\n",
"\n",
"print(torch.__version__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.1 获取和读取数据"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"batch_size = 256\n",
"train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.2 定义模型参数"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"num_inputs, num_outputs, num_hiddens = 784, 10, 256\n",
"\n",
"W1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hiddens)), dtype=torch.float)\n",
"b1 = torch.zeros(num_hiddens, dtype=torch.float)\n",
"W2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens, num_outputs)), dtype=torch.float)\n",
"b2 = torch.zeros(num_outputs, dtype=torch.float)\n",
"\n",
"params = [W1, b1, W2, b2]\n",
"for param in params:\n",
" param.requires_grad_(requires_grad=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.3 定义激活函数"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def relu(X):\n",
" return torch.max(input=X, other=torch.tensor(0.0))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.4 定义模型"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def net(X):\n",
" X = X.view((-1, num_inputs))\n",
" H = relu(torch.matmul(X, W1) + b1)\n",
" return torch.matmul(H, W2) + b2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.5 定义损失函数"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"loss = torch.nn.CrossEntropyLoss()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3.9.6 训练模型"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"epoch 1, loss 0.0030, train acc 0.714, test acc 0.753\n",
"epoch 2, loss 0.0019, train acc 0.821, test acc 0.777\n",
"epoch 3, loss 0.0017, train acc 0.842, test acc 0.834\n",
"epoch 4, loss 0.0015, train acc 0.857, test acc 0.839\n",
"epoch 5, loss 0.0014, train acc 0.865, test acc 0.845\n"
]
}
],
"source": [
"num_epochs, lr = 5, 100.0\n",
"d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, params, lr)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}