├── .gitignore
├── .travis.yml
├── Chapter11
├── 11-2.ipynb
└── 11-2.md
├── Chapter12
├── 12-1-2.ipynb
└── 12-1-2.md
├── Chapter6
├── 6-2-2-1.ipynb
├── 6-2-2-1.md
├── 6-2-2-2.ipynb
├── 6-2-2-2.md
├── 6-2-2-3.ipynb
├── 6-2-2-3.md
├── 6-3-1.ipynb
├── 6-3-1.md
├── 6-3-2.ipynb
├── 6-3-2.md
├── __init__.py
├── deep-linear-network.ipynb
├── deep-linear-network.md
└── mnist_loader.py
├── Chapter7
├── 7-1-1.ipynb
├── 7-1-1.md
├── 7-1-2.ipynb
├── 7-1-2.md
├── 7-11.ipynb
├── 7-11.md
├── 7-12.ipynb
├── 7-12.md
├── 7-8.ipynb
├── 7-8.md
├── checkpoint.pt
├── early_stopping.py
└── mnist_loader.py
├── Chapter8
├── 8-3-1.ipynb
├── 8-3-1.md
├── 8-3-2.ipynb
├── 8-3-2.md
├── 8-5-1.ipynb
├── 8-5-1.md
├── 8-5-2.ipynb
├── 8-5-2.md
├── 8-5-3.ipynb
├── 8-5-3.md
└── mnist_loader.py
├── Chapter9
├── CNN.ipynb
└── mnist_loader.py
├── README.md
├── SUMMARY.md
├── book.json
├── mnist.pkl.gz
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | __pycache__
3 | .ipynb_checkpoints
4 | .idea
5 | node_modules
6 | _book
7 | _build
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - '8.9.1'
4 |
5 | # S: Build Lifecycle
6 | install:
7 | - npm install gitbook-cli
8 |
9 | after_script:
10 | - gitbook install
11 | - gitbook build
12 | - cd ./_book
13 | - git init
14 | - git config usr.name "windmissing"
15 | - git config user.email "${USER_EMAIL}"
16 | - git add .
17 | - git commit -m "publish gitbook"
18 | - git push --force --quiet "https://${test_token}@github.com/windmissing/DeepLearningPractise" master:gh-pages
19 |
20 | branchs:
21 | only:
22 | master
--------------------------------------------------------------------------------
/Chapter11/11-2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 将模型写入文件"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "import torch \n",
15 | "torch.save(model.state_dict(), modelname)"
16 | ]
17 | },
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {},
21 | "source": [
22 | "# 从文件读入模型"
23 | ]
24 | },
25 | {
26 | "cell_type": "markdown",
27 | "metadata": {},
28 | "source": [
29 | "model = CNN() # 需要先建立模型 \n",
30 | "model.load_state_dict(torch.load(modelname)) # 加载模型 "
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": null,
36 | "metadata": {},
37 | "outputs": [],
38 | "source": []
39 | }
40 | ],
41 | "metadata": {
42 | "kernelspec": {
43 | "display_name": "Python 3",
44 | "language": "python",
45 | "name": "python3"
46 | },
47 | "language_info": {
48 | "codemirror_mode": {
49 | "name": "ipython",
50 | "version": 3
51 | },
52 | "file_extension": ".py",
53 | "mimetype": "text/x-python",
54 | "name": "python",
55 | "nbconvert_exporter": "python",
56 | "pygments_lexer": "ipython3",
57 | "version": "3.7.3"
58 | }
59 | },
60 | "nbformat": 4,
61 | "nbformat_minor": 2
62 | }
63 |
--------------------------------------------------------------------------------
/Chapter11/11-2.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter12/12-1-2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 判断是否支持GPU"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [
15 | {
16 | "data": {
17 | "text/plain": [
18 | "False"
19 | ]
20 | },
21 | "execution_count": 1,
22 | "metadata": {},
23 | "output_type": "execute_result"
24 | }
25 | ],
26 | "source": [
27 | "import torch\n",
28 | "torch.cuda.is_available()"
29 | ]
30 | },
31 | {
32 | "cell_type": "code",
33 | "execution_count": 1,
34 | "metadata": {},
35 | "outputs": [
36 | {
37 | "data": {
38 | "text/plain": [
39 | "device(type='cpu')"
40 | ]
41 | },
42 | "execution_count": 1,
43 | "metadata": {},
44 | "output_type": "execute_result"
45 | }
46 | ],
47 | "source": [
48 | "import torch\n",
49 | "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
50 | "device"
51 | ]
52 | },
53 | {
54 | "cell_type": "markdown",
55 | "metadata": {},
56 | "source": [
57 | "# 让模型支持GPU"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": 3,
63 | "metadata": {},
64 | "outputs": [],
65 | "source": [
66 | "# network、data、label要成为cuda类型\n",
67 | "def TensorAndCuda(img, label):\n",
68 | " img = torch.Tensor(img)\n",
69 | " label = torch.Tensor(label) \n",
70 | " if torch.cuda.is_available():\n",
71 | " img = img.cuda()\n",
72 | " label = label.cuda()\n",
73 | " network = network.cuda()\n",
74 | " else:\n",
75 | " img = Variable(img)\n",
76 | " label = Variable(label)"
77 | ]
78 | },
79 | {
80 | "cell_type": "markdown",
81 | "metadata": {},
82 | "source": [
83 | "# 清除GPU的缓存"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 4,
89 | "metadata": {},
90 | "outputs": [],
91 | "source": [
92 | "torch.cuda.empty_cache()"
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "# GPU运行结果计算准确率"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "```python\n",
107 | "out = network(img)\n",
108 | "_, predicted = torch.max(out, 1)\n",
109 | "cpu_info = predicted.cpu()\n",
110 | "correct = (cpu_info == torch.Tensor(label[0])).sum().item()\n",
111 | "accuracy = correct / data[0].shape[0]\n",
112 | "print('validate accuracy: {:.4}'.format(accuracy))\n",
113 | "```"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": null,
119 | "metadata": {},
120 | "outputs": [],
121 | "source": []
122 | }
123 | ],
124 | "metadata": {
125 | "kernelspec": {
126 | "display_name": "Python 3",
127 | "language": "python",
128 | "name": "python3"
129 | },
130 | "language_info": {
131 | "codemirror_mode": {
132 | "name": "ipython",
133 | "version": 3
134 | },
135 | "file_extension": ".py",
136 | "mimetype": "text/x-python",
137 | "name": "python",
138 | "nbconvert_exporter": "python",
139 | "pygments_lexer": "ipython3",
140 | "version": "3.7.3"
141 | }
142 | },
143 | "nbformat": 4,
144 | "nbformat_minor": 2
145 | }
146 |
--------------------------------------------------------------------------------
/Chapter12/12-1-2.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter6/6-2-2-1.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/6-2-2-2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import torch.nn as nn\n",
10 | "import torch.nn.functional as F\n",
11 | "from torch.autograd import Variable\n",
12 | "import torch as t"
13 | ]
14 | },
15 | {
16 | "cell_type": "markdown",
17 | "metadata": {},
18 | "source": [
19 | "# Sigmoid + MSE Cost"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 2,
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "class Net(nn.Module):\n",
29 | " def __init__(self):\n",
30 | " super(Net, self).__init__()\n",
31 | " \n",
32 | " self.fc1 = nn.Linear(28*28, 30)\n",
33 | " self.fc2 = nn.Linear(30, 10)\n",
34 | " \n",
35 | " def forward(self, x):\n",
36 | " x = x.view(x.shape[0], -1)\n",
37 | " x = self.fc1(x)\n",
38 | " x = F.logsigmoid(self.fc2(x))\n",
39 | " return x"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": 3,
45 | "metadata": {},
46 | "outputs": [],
47 | "source": [
48 | "from mnist_loader import load_data_shared, vectorized_result\n",
49 | "training_data, validation_data, test_data = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
50 | " seed=666,\n",
51 | " train_size=2000,\n",
52 | " vali_size=0,\n",
53 | " test_size=100)"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 4,
59 | "metadata": {},
60 | "outputs": [],
61 | "source": [
62 | "def predict(data, net):\n",
63 | " with t.no_grad():\n",
64 | " #for index in range(test_data[0].shape[0]):\n",
65 | " # get the inputs\n",
66 | " inputs, labels = t.Tensor(data[0]), data[1]\n",
67 | "\n",
68 | " # forward + backward + optimize\n",
69 | " outputs = net(inputs)\n",
70 | " _, predicted = t.max(outputs, 1)\n",
71 | "\n",
72 | " #print('Predicted: ', predicted)\n",
73 | " #print('target: ', t.Tensor(labels).int())\n",
74 | "\n",
75 | " correct = (predicted == t.Tensor(labels)).sum().item()\n",
76 | " accuracy = correct / data[0].shape[0]\n",
77 | " return accuracy"
78 | ]
79 | },
80 | {
81 | "cell_type": "code",
82 | "execution_count": 5,
83 | "metadata": {},
84 | "outputs": [],
85 | "source": [
86 | "def fit(net, criterion, optimizer):\n",
87 | " loss_scores = []\n",
88 | " test_scores = []\n",
89 | " train_scores = []\n",
90 | " for epoch in range(100): # loop over the dataset multiple times\n",
91 | "\n",
92 | " # get the inputs\n",
93 | " inputs, labels = t.Tensor(training_data[0]), t.Tensor(training_data[1])\n",
94 | " vector_labels = t.Tensor([vectorized_result(y) for y in training_data[1]])\n",
95 | " # zero the parameter gradients\n",
96 | " optimizer.zero_grad()\n",
97 | "\n",
98 | " # forward + backward + optimize\n",
99 | " outputs = net(inputs)\n",
100 | " loss = criterion(outputs, vector_labels.float())\n",
101 | " loss.backward()\n",
102 | " optimizer.step()\n",
103 | "\n",
104 | " # print statistics\n",
105 | " loss_scores.append(loss.item())\n",
106 | " train_scores.append(predict(training_data, net))\n",
107 | " test_scores.append(predict(test_data, net))\n",
108 | " print('Finished Training')\n",
109 | " return loss_scores, train_scores, test_scores"
110 | ]
111 | },
112 | {
113 | "cell_type": "code",
114 | "execution_count": 6,
115 | "metadata": {},
116 | "outputs": [
117 | {
118 | "name": "stdout",
119 | "output_type": "stream",
120 | "text": [
121 | "Finished Training\n"
122 | ]
123 | }
124 | ],
125 | "source": [
126 | "import torch.optim as optim\n",
127 | "net1 = Net()\n",
128 | "criterion = nn.MSELoss()\n",
129 | "optimizer = optim.SGD(net1.parameters(), lr = 1e-1)\n",
130 | "loss_scores, train_scores, test_scores = fit(net1, criterion, optimizer)"
131 | ]
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": 7,
136 | "metadata": {},
137 | "outputs": [
138 | {
139 | "data": {
140 | "text/plain": [
141 | ""
142 | ]
143 | },
144 | "metadata": {},
145 | "output_type": "display_data"
146 | }
147 | ],
148 | "source": [
149 | "import matplotlib.pyplot as plt\n",
150 | "\n",
151 | "plt.plot(loss_scores)\n",
152 | "plt.show()"
153 | ]
154 | },
155 | {
156 | "cell_type": "code",
157 | "execution_count": 8,
158 | "metadata": {},
159 | "outputs": [
160 | {
161 | "data": {
162 | "image/png": "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\n",
163 | "text/plain": [
164 | ""
165 | ]
166 | },
167 | "metadata": {
168 | "needs_background": "light"
169 | },
170 | "output_type": "display_data"
171 | }
172 | ],
173 | "source": [
174 | "import matplotlib.pyplot as plt\n",
175 | "plt.plot(train_scores)\n",
176 | "plt.plot(test_scores)\n",
177 | "plt.show()"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "# Sigmoid Unit + Cross Entropy Cost"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 9,
190 | "metadata": {},
191 | "outputs": [],
192 | "source": [
193 | "def fit2(net, criterion, optimizer):\n",
194 | " loss_scores = []\n",
195 | " test_scores = []\n",
196 | " train_scores = []\n",
197 | " for epoch in range(100): # loop over the dataset multiple times\n",
198 | "\n",
199 | " # get the inputs\n",
200 | " inputs, labels = t.Tensor(training_data[0]), t.Tensor(training_data[1])\n",
201 | " vector_labels = t.Tensor([vectorized_result(y) for y in training_data[1]])\n",
202 | " # zero the parameter gradients\n",
203 | " optimizer.zero_grad()\n",
204 | "\n",
205 | " # forward + backward + optimize\n",
206 | " outputs = net(inputs)\n",
207 | " loss = criterion(outputs, labels.long())\n",
208 | " loss.backward()\n",
209 | " optimizer.step()\n",
210 | "\n",
211 | " # print statistics\n",
212 | " loss_scores.append(loss.item())\n",
213 | " train_scores.append(predict(training_data, net))\n",
214 | " test_scores.append(predict(test_data, net))\n",
215 | " print('Finished Training')\n",
216 | " return loss_scores, train_scores, test_scores"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 10,
222 | "metadata": {},
223 | "outputs": [
224 | {
225 | "name": "stdout",
226 | "output_type": "stream",
227 | "text": [
228 | "Finished Training\n"
229 | ]
230 | }
231 | ],
232 | "source": [
233 | "import torch.optim as optim\n",
234 | "net2 = Net()\n",
235 | "criterion = nn.CrossEntropyLoss()\n",
236 | "optimizer = optim.SGD(net2.parameters(), lr = 1e-1)\n",
237 | "loss_scores2, train_scores2, test_scores2 = fit2(net2, criterion, optimizer)"
238 | ]
239 | },
240 | {
241 | "cell_type": "code",
242 | "execution_count": 11,
243 | "metadata": {},
244 | "outputs": [
245 | {
246 | "data": {
247 | "image/png": "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\n",
248 | "text/plain": [
249 | ""
250 | ]
251 | },
252 | "metadata": {
253 | "needs_background": "light"
254 | },
255 | "output_type": "display_data"
256 | }
257 | ],
258 | "source": [
259 | "import matplotlib.pyplot as plt\n",
260 | "\n",
261 | "plt.plot(loss_scores)\n",
262 | "plt.show()"
263 | ]
264 | },
265 | {
266 | "cell_type": "code",
267 | "execution_count": 12,
268 | "metadata": {},
269 | "outputs": [
270 | {
271 | "data": {
272 | "image/png": "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\n",
273 | "text/plain": [
274 | ""
275 | ]
276 | },
277 | "metadata": {
278 | "needs_background": "light"
279 | },
280 | "output_type": "display_data"
281 | }
282 | ],
283 | "source": [
284 | "import matplotlib.pyplot as plt\n",
285 | "plt.plot(train_scores2)\n",
286 | "plt.plot(test_scores2)\n",
287 | "plt.show()"
288 | ]
289 | },
290 | {
291 | "cell_type": "markdown",
292 | "metadata": {},
293 | "source": [
294 | "# MSE VS Cross Entropy"
295 | ]
296 | },
297 | {
298 | "cell_type": "code",
299 | "execution_count": 13,
300 | "metadata": {},
301 | "outputs": [
302 | {
303 | "data": {
304 | "image/png": "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\n",
305 | "text/plain": [
306 | ""
307 | ]
308 | },
309 | "metadata": {
310 | "needs_background": "light"
311 | },
312 | "output_type": "display_data"
313 | }
314 | ],
315 | "source": [
316 | "import matplotlib.pyplot as plt\n",
317 | "plt.plot(test_scores)\n",
318 | "plt.plot(test_scores2)\n",
319 | "plt.show()"
320 | ]
321 | },
322 | {
323 | "cell_type": "markdown",
324 | "metadata": {},
325 | "source": [
326 | "理论上,cross entropy只在初期优于MSE,但实际上差距很明显"
327 | ]
328 | },
329 | {
330 | "cell_type": "code",
331 | "execution_count": null,
332 | "metadata": {},
333 | "outputs": [],
334 | "source": []
335 | }
336 | ],
337 | "metadata": {
338 | "kernelspec": {
339 | "display_name": "Python 3",
340 | "language": "python",
341 | "name": "python3"
342 | },
343 | "language_info": {
344 | "codemirror_mode": {
345 | "name": "ipython",
346 | "version": 3
347 | },
348 | "file_extension": ".py",
349 | "mimetype": "text/x-python",
350 | "name": "python",
351 | "nbconvert_exporter": "python",
352 | "pygments_lexer": "ipython3",
353 | "version": "3.7.3"
354 | }
355 | },
356 | "nbformat": 4,
357 | "nbformat_minor": 2
358 | }
359 |
--------------------------------------------------------------------------------
/Chapter6/6-2-2-2.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/6-2-2-3.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/6-3-1.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/6-3-2.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/windmissing/DeepLearningPractise/0f324b5caa82a52bb44ba6749cd68572e0b36f6d/Chapter6/__init__.py
--------------------------------------------------------------------------------
/Chapter6/deep-linear-network.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter6/mnist_loader.py:
--------------------------------------------------------------------------------
1 | #### Libraries
2 | # Standard library
3 | import pickle
4 | import gzip
5 |
6 | # Third-party libraries
7 | import numpy as np
8 |
9 | #### Load the MNIST data
10 | def get_part(data, seed, size):
11 | X, y = data
12 | n = X.shape[0]
13 | if n <= size:return data
14 | if seed:
15 | np.random.seed(seed)
16 | shuffle_indexes = np.random.permutation(n)
17 | part_indexes = shuffle_indexes[:size]
18 | return X[part_indexes], y[part_indexes]
19 |
20 | def vectorized_result(j):
21 | """Return a 10-dimensional unit vector with a 1.0 in the jth
22 | position and zeroes elsewhere. This is used to convert a digit
23 | (0...9) into a corresponding desired output from the neural
24 | network."""
25 | e = np.zeros(10)
26 | e[j] = 1.0
27 | return e
28 |
29 | def vectorize(data):
30 | vector_y = [vectorized_result(y) for y in data[1]]
31 | return (data[0], np.array(vector_y))
32 | #return (data[0], data[1])
33 |
34 | def load_data_shared(filename, seed, train_size, vali_size, test_size):
35 | f = gzip.open(filename, 'rb')
36 | training_data, validation_data, test_data = pickle.load(f,encoding='bytes')
37 |
38 | return get_part(training_data, seed, train_size),\
39 | get_part(validation_data, seed, vali_size),\
40 | get_part(test_data, seed, test_size)
--------------------------------------------------------------------------------
/Chapter7/7-1-1.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter7/7-1-2.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter7/7-11.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import torch.nn as nn\n",
10 | "import torch.nn.functional as F\n",
11 | "from torch.autograd import Variable\n",
12 | "import torch as t\n",
13 | "from early_stopping import EarlyStopping"
14 | ]
15 | },
16 | {
17 | "cell_type": "markdown",
18 | "metadata": {},
19 | "source": [
20 | "# ReLU + Sigmoid + Cross Entropy + L2 + early stopping"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": 2,
26 | "metadata": {},
27 | "outputs": [],
28 | "source": [
29 | "class Net(nn.Module):\n",
30 | " def __init__(self):\n",
31 | " super(Net, self).__init__()\n",
32 | " \n",
33 | " self.fc1 = nn.Linear(28*28, 300)\n",
34 | " self.fc2 = nn.Linear(300, 10)\n",
35 | " \n",
36 | " def forward(self, x):\n",
37 | " x = x.view(x.shape[0], -1)\n",
38 | " x = F.relu(self.fc1(x))\n",
39 | " x = F.logsigmoid(self.fc2(x))\n",
40 | " return x"
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": 3,
46 | "metadata": {},
47 | "outputs": [],
48 | "source": [
49 | "from mnist_loader import load_data_shared, vectorized_result\n",
50 | "training_data1, validation_data1, _ = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
51 | " seed=666,\n",
52 | " train_size=400,\n",
53 | " vali_size=100,\n",
54 | " test_size=0)\n",
55 | "training_data2, validation_data2, _ = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
56 | " seed=666,\n",
57 | " train_size=400,\n",
58 | " vali_size=100,\n",
59 | " test_size=0)\n",
60 | "training_data3, validation_data3, _ = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
61 | " seed=666,\n",
62 | " train_size=400,\n",
63 | " vali_size=100,\n",
64 | " test_size=0)\n",
65 | "_, _, test_data = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
66 | " seed=666,\n",
67 | " train_size=0,\n",
68 | " vali_size=0,\n",
69 | " test_size=100)"
70 | ]
71 | },
72 | {
73 | "cell_type": "code",
74 | "execution_count": 4,
75 | "metadata": {},
76 | "outputs": [],
77 | "source": [
78 | "def predict(data, net, criterion):\n",
79 | " with t.no_grad():\n",
80 | " #for index in range(test_data[0].shape[0]):\n",
81 | " # get the inputs\n",
82 | " inputs, labels = t.Tensor(data[0]), t.Tensor(data[1])\n",
83 | "\n",
84 | " # forward + backward + optimize\n",
85 | " outputs = net(inputs)\n",
86 | " _, predicted = t.max(outputs, 1)\n",
87 | " loss = criterion(outputs, labels.long())\n",
88 | "\n",
89 | " correct = (predicted == labels).sum().item()\n",
90 | " accuracy = correct / data[0].shape[0]\n",
91 | " return loss, accuracy"
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 5,
97 | "metadata": {},
98 | "outputs": [],
99 | "source": [
100 | "def fit(net, train_data, vali_data, criterion, optimizer, is_early_stopping):\n",
101 | " loss_scores = []\n",
102 | " validate_loss = []\n",
103 | " \n",
104 | " # initialize the early_stopping object\n",
105 | " early_stopping = EarlyStopping(patience=3, verbose=False)\n",
106 | " \n",
107 | " for epoch in range(1000): # loop over the dataset multiple times\n",
108 | "\n",
109 | " # get the inputs\n",
110 | " inputs, labels = t.Tensor(train_data[0]), t.Tensor(train_data[1])\n",
111 | " vector_labels = t.Tensor([vectorized_result(y) for y in train_data[1]])\n",
112 | " # zero the parameter gradients\n",
113 | " optimizer.zero_grad()\n",
114 | "\n",
115 | " # forward + backward + optimize\n",
116 | " outputs = net(inputs)\n",
117 | " loss = criterion(outputs, labels.long())\n",
118 | " loss.backward()\n",
119 | " optimizer.step()\n",
120 | "\n",
121 | " # print statistics\n",
122 | " loss_scores.append(loss.item())\n",
123 | " #train_scores.append(predict(training_data, net))\n",
124 | " one_vali_loss, _ = predict(vali_data, net, criterion)\n",
125 | " validate_loss.append(one_vali_loss)\n",
126 | " \n",
127 | " if is_early_stopping:\n",
128 | " early_stopping(one_vali_loss, net)\n",
129 | "\n",
130 | " if early_stopping.early_stop:\n",
131 | " print(\"Early stopping at \", epoch)\n",
132 | " break\n",
133 | " \n",
134 | " print('Finished Training')\n",
135 | " return net"
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {},
141 | "source": [
142 | "# 子网络"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 6,
148 | "metadata": {},
149 | "outputs": [
150 | {
151 | "name": "stdout",
152 | "output_type": "stream",
153 | "text": [
154 | "EarlyStopping counter: 1 out of 3\n",
155 | "EarlyStopping counter: 1 out of 3\n",
156 | "EarlyStopping counter: 1 out of 3\n",
157 | "EarlyStopping counter: 1 out of 3\n",
158 | "EarlyStopping counter: 1 out of 3\n",
159 | "EarlyStopping counter: 1 out of 3\n",
160 | "EarlyStopping counter: 1 out of 3\n",
161 | "EarlyStopping counter: 1 out of 3\n",
162 | "EarlyStopping counter: 1 out of 3\n",
163 | "EarlyStopping counter: 1 out of 3\n",
164 | "EarlyStopping counter: 1 out of 3\n",
165 | "EarlyStopping counter: 1 out of 3\n",
166 | "EarlyStopping counter: 1 out of 3\n",
167 | "EarlyStopping counter: 1 out of 3\n",
168 | "EarlyStopping counter: 1 out of 3\n",
169 | "EarlyStopping counter: 1 out of 3\n",
170 | "EarlyStopping counter: 1 out of 3\n",
171 | "EarlyStopping counter: 1 out of 3\n",
172 | "EarlyStopping counter: 1 out of 3\n",
173 | "EarlyStopping counter: 1 out of 3\n",
174 | "EarlyStopping counter: 1 out of 3\n",
175 | "EarlyStopping counter: 1 out of 3\n",
176 | "EarlyStopping counter: 2 out of 3\n",
177 | "EarlyStopping counter: 1 out of 3\n",
178 | "EarlyStopping counter: 1 out of 3\n",
179 | "EarlyStopping counter: 1 out of 3\n",
180 | "EarlyStopping counter: 1 out of 3\n",
181 | "EarlyStopping counter: 1 out of 3\n",
182 | "EarlyStopping counter: 1 out of 3\n",
183 | "EarlyStopping counter: 2 out of 3\n",
184 | "EarlyStopping counter: 1 out of 3\n",
185 | "EarlyStopping counter: 2 out of 3\n",
186 | "EarlyStopping counter: 1 out of 3\n",
187 | "EarlyStopping counter: 2 out of 3\n",
188 | "EarlyStopping counter: 1 out of 3\n",
189 | "EarlyStopping counter: 1 out of 3\n",
190 | "EarlyStopping counter: 1 out of 3\n",
191 | "EarlyStopping counter: 2 out of 3\n",
192 | "EarlyStopping counter: 3 out of 3\n",
193 | "Early stopping at 696\n",
194 | "Finished Training\n"
195 | ]
196 | },
197 | {
198 | "data": {
199 | "text/plain": [
200 | "(tensor(0.4662), 0.84)"
201 | ]
202 | },
203 | "execution_count": 6,
204 | "metadata": {},
205 | "output_type": "execute_result"
206 | }
207 | ],
208 | "source": [
209 | "import torch.optim as optim\n",
210 | "net1 = Net()\n",
211 | "criterion1 = nn.CrossEntropyLoss()\n",
212 | "optimizer1 = optim.SGD(net1.parameters(), lr = 1e-1, weight_decay=1e-2)\n",
213 | "net1 = fit(net1, training_data1, validation_data1, criterion1, optimizer1, True)\n",
214 | "predict(test_data, net1, criterion1)"
215 | ]
216 | },
217 | {
218 | "cell_type": "code",
219 | "execution_count": 7,
220 | "metadata": {},
221 | "outputs": [
222 | {
223 | "name": "stdout",
224 | "output_type": "stream",
225 | "text": [
226 | "EarlyStopping counter: 1 out of 3\n",
227 | "EarlyStopping counter: 1 out of 3\n",
228 | "EarlyStopping counter: 1 out of 3\n",
229 | "EarlyStopping counter: 1 out of 3\n",
230 | "EarlyStopping counter: 1 out of 3\n",
231 | "EarlyStopping counter: 1 out of 3\n",
232 | "EarlyStopping counter: 1 out of 3\n",
233 | "EarlyStopping counter: 1 out of 3\n",
234 | "EarlyStopping counter: 1 out of 3\n",
235 | "EarlyStopping counter: 1 out of 3\n",
236 | "EarlyStopping counter: 1 out of 3\n",
237 | "EarlyStopping counter: 1 out of 3\n",
238 | "EarlyStopping counter: 1 out of 3\n",
239 | "EarlyStopping counter: 1 out of 3\n",
240 | "EarlyStopping counter: 1 out of 3\n",
241 | "EarlyStopping counter: 1 out of 3\n",
242 | "EarlyStopping counter: 1 out of 3\n",
243 | "EarlyStopping counter: 1 out of 3\n",
244 | "EarlyStopping counter: 1 out of 3\n",
245 | "EarlyStopping counter: 1 out of 3\n",
246 | "EarlyStopping counter: 1 out of 3\n",
247 | "EarlyStopping counter: 1 out of 3\n",
248 | "EarlyStopping counter: 1 out of 3\n",
249 | "EarlyStopping counter: 1 out of 3\n",
250 | "EarlyStopping counter: 1 out of 3\n",
251 | "EarlyStopping counter: 1 out of 3\n",
252 | "EarlyStopping counter: 2 out of 3\n",
253 | "EarlyStopping counter: 1 out of 3\n",
254 | "EarlyStopping counter: 2 out of 3\n",
255 | "EarlyStopping counter: 1 out of 3\n",
256 | "EarlyStopping counter: 1 out of 3\n",
257 | "EarlyStopping counter: 2 out of 3\n",
258 | "EarlyStopping counter: 1 out of 3\n",
259 | "EarlyStopping counter: 1 out of 3\n",
260 | "EarlyStopping counter: 1 out of 3\n",
261 | "EarlyStopping counter: 1 out of 3\n",
262 | "EarlyStopping counter: 1 out of 3\n",
263 | "EarlyStopping counter: 2 out of 3\n",
264 | "EarlyStopping counter: 1 out of 3\n",
265 | "EarlyStopping counter: 2 out of 3\n",
266 | "EarlyStopping counter: 1 out of 3\n",
267 | "EarlyStopping counter: 2 out of 3\n",
268 | "EarlyStopping counter: 1 out of 3\n",
269 | "EarlyStopping counter: 2 out of 3\n",
270 | "EarlyStopping counter: 1 out of 3\n",
271 | "EarlyStopping counter: 1 out of 3\n",
272 | "EarlyStopping counter: 1 out of 3\n",
273 | "EarlyStopping counter: 1 out of 3\n",
274 | "EarlyStopping counter: 2 out of 3\n",
275 | "EarlyStopping counter: 3 out of 3\n",
276 | "Early stopping at 711\n",
277 | "Finished Training\n"
278 | ]
279 | },
280 | {
281 | "data": {
282 | "text/plain": [
283 | "(tensor(0.4531), 0.85)"
284 | ]
285 | },
286 | "execution_count": 7,
287 | "metadata": {},
288 | "output_type": "execute_result"
289 | }
290 | ],
291 | "source": [
292 | "net2 = Net()\n",
293 | "criterion2 = nn.CrossEntropyLoss()\n",
294 | "optimizer2 = optim.SGD(net2.parameters(), lr = 1e-1, weight_decay=1e-2)\n",
295 | "net2 = fit(net2, training_data2, validation_data2, criterion2, optimizer2, True)\n",
296 | "predict(test_data, net2, criterion2)"
297 | ]
298 | },
299 | {
300 | "cell_type": "code",
301 | "execution_count": 8,
302 | "metadata": {},
303 | "outputs": [
304 | {
305 | "name": "stdout",
306 | "output_type": "stream",
307 | "text": [
308 | "EarlyStopping counter: 1 out of 3\n",
309 | "EarlyStopping counter: 1 out of 3\n",
310 | "EarlyStopping counter: 1 out of 3\n",
311 | "EarlyStopping counter: 1 out of 3\n",
312 | "EarlyStopping counter: 1 out of 3\n",
313 | "EarlyStopping counter: 1 out of 3\n",
314 | "EarlyStopping counter: 1 out of 3\n",
315 | "EarlyStopping counter: 1 out of 3\n",
316 | "EarlyStopping counter: 1 out of 3\n",
317 | "EarlyStopping counter: 1 out of 3\n",
318 | "EarlyStopping counter: 1 out of 3\n",
319 | "EarlyStopping counter: 1 out of 3\n",
320 | "EarlyStopping counter: 1 out of 3\n",
321 | "EarlyStopping counter: 1 out of 3\n",
322 | "EarlyStopping counter: 1 out of 3\n",
323 | "EarlyStopping counter: 1 out of 3\n",
324 | "EarlyStopping counter: 1 out of 3\n",
325 | "EarlyStopping counter: 1 out of 3\n",
326 | "EarlyStopping counter: 1 out of 3\n",
327 | "EarlyStopping counter: 1 out of 3\n",
328 | "EarlyStopping counter: 1 out of 3\n",
329 | "EarlyStopping counter: 1 out of 3\n",
330 | "EarlyStopping counter: 1 out of 3\n",
331 | "EarlyStopping counter: 1 out of 3\n",
332 | "EarlyStopping counter: 1 out of 3\n",
333 | "EarlyStopping counter: 1 out of 3\n",
334 | "EarlyStopping counter: 1 out of 3\n",
335 | "EarlyStopping counter: 1 out of 3\n",
336 | "EarlyStopping counter: 1 out of 3\n",
337 | "EarlyStopping counter: 1 out of 3\n",
338 | "EarlyStopping counter: 1 out of 3\n",
339 | "EarlyStopping counter: 1 out of 3\n",
340 | "EarlyStopping counter: 2 out of 3\n",
341 | "EarlyStopping counter: 3 out of 3\n",
342 | "Early stopping at 716\n",
343 | "Finished Training\n"
344 | ]
345 | },
346 | {
347 | "data": {
348 | "text/plain": [
349 | "(tensor(0.4567), 0.84)"
350 | ]
351 | },
352 | "execution_count": 8,
353 | "metadata": {},
354 | "output_type": "execute_result"
355 | }
356 | ],
357 | "source": [
358 | "net3 = Net()\n",
359 | "criterion3 = nn.CrossEntropyLoss()\n",
360 | "optimizer3 = optim.SGD(net3.parameters(), lr = 1e-1, weight_decay=1e-2)\n",
361 | "net3 = fit(net3, training_data3, validation_data3, criterion3, optimizer3, True)\n",
362 | "predict(test_data, net3, criterion3)"
363 | ]
364 | },
365 | {
366 | "cell_type": "markdown",
367 | "metadata": {},
368 | "source": [
369 | "# Bagging"
370 | ]
371 | },
372 | {
373 | "cell_type": "code",
374 | "execution_count": 9,
375 | "metadata": {},
376 | "outputs": [],
377 | "source": [
378 | "import numpy as np\n",
379 | "def predict2(data, nets):\n",
380 | " with t.no_grad():\n",
381 | " inputs, labels = t.Tensor(data[0]), t.Tensor(data[1])\n",
382 | " output = t.FloatTensor(data[0].shape[0], 10).zero_()\n",
383 | " for net in nets:\n",
384 | " output += net(inputs)\n",
385 | " _, predicted = t.max(output, 1)\n",
386 | "\n",
387 | " correct = (predicted == labels).sum().item()\n",
388 | " accuracy = correct / data[0].shape[0]\n",
389 | " return accuracy"
390 | ]
391 | },
392 | {
393 | "cell_type": "code",
394 | "execution_count": 10,
395 | "metadata": {},
396 | "outputs": [
397 | {
398 | "data": {
399 | "text/plain": [
400 | "0.84"
401 | ]
402 | },
403 | "execution_count": 10,
404 | "metadata": {},
405 | "output_type": "execute_result"
406 | }
407 | ],
408 | "source": [
409 | "predict2(test_data, [net1, net2, net3])"
410 | ]
411 | },
412 | {
413 | "cell_type": "markdown",
414 | "metadata": {},
415 | "source": [
416 | "总的准确率比单个准确率低,这是为什么? \n",
417 | "难道是相关性太大?"
418 | ]
419 | },
420 | {
421 | "cell_type": "code",
422 | "execution_count": null,
423 | "metadata": {},
424 | "outputs": [],
425 | "source": []
426 | }
427 | ],
428 | "metadata": {
429 | "kernelspec": {
430 | "display_name": "Python 3",
431 | "language": "python",
432 | "name": "python3"
433 | },
434 | "language_info": {
435 | "codemirror_mode": {
436 | "name": "ipython",
437 | "version": 3
438 | },
439 | "file_extension": ".py",
440 | "mimetype": "text/x-python",
441 | "name": "python",
442 | "nbconvert_exporter": "python",
443 | "pygments_lexer": "ipython3",
444 | "version": "3.7.3"
445 | }
446 | },
447 | "nbformat": 4,
448 | "nbformat_minor": 2
449 | }
450 |
--------------------------------------------------------------------------------
/Chapter7/7-11.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter7/7-12.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter7/7-8.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Chapter7/checkpoint.pt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/windmissing/DeepLearningPractise/0f324b5caa82a52bb44ba6749cd68572e0b36f6d/Chapter7/checkpoint.pt
--------------------------------------------------------------------------------
/Chapter7/early_stopping.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import torch
3 |
4 | class EarlyStopping:
5 | """Early stops the training if validation loss doesn't improve after a given patience."""
6 | def __init__(self, patience=7, verbose=False, delta=0):
7 | """
8 | Args:
9 | patience (int): How long to wait after last time validation loss improved.
10 | Default: 7
11 | verbose (bool): If True, prints a message for each validation loss improvement.
12 | Default: False
13 | delta (float): Minimum change in the monitored quantity to qualify as an improvement.
14 | Default: 0
15 | """
16 | self.patience = patience
17 | self.verbose = verbose
18 | self.counter = 0
19 | self.best_score = None
20 | self.early_stop = False
21 | self.val_loss_min = np.Inf
22 | self.delta = delta
23 |
24 | def __call__(self, val_loss, model):
25 |
26 | score = -val_loss
27 |
28 | if self.best_score is None:
29 | self.best_score = score
30 | self.save_checkpoint(val_loss, model)
31 | elif score < self.best_score + self.delta:
32 | self.counter += 1
33 | print(f'EarlyStopping counter: {self.counter} out of {self.patience}')
34 | if self.counter >= self.patience:
35 | self.early_stop = True
36 | else:
37 | self.best_score = score
38 | self.save_checkpoint(val_loss, model)
39 | self.counter = 0
40 |
41 | def save_checkpoint(self, val_loss, model):
42 | '''Saves model when validation loss decrease.'''
43 | if self.verbose:
44 | print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}). Saving model ...')
45 | torch.save(model.state_dict(), 'checkpoint.pt')
46 | self.val_loss_min = val_loss
47 |
--------------------------------------------------------------------------------
/Chapter7/mnist_loader.py:
--------------------------------------------------------------------------------
1 | #### Libraries
2 | # Standard library
3 | import pickle
4 | import gzip
5 |
6 | # Third-party libraries
7 | import numpy as np
8 |
9 | #### Load the MNIST data
10 | def get_part(data, seed, size):
11 | X, y = data
12 | n = X.shape[0]
13 | if n <= size:return data
14 | if seed:
15 | np.random.seed(seed)
16 | shuffle_indexes = np.random.permutation(n)
17 | part_indexes = shuffle_indexes[:size]
18 | return X[part_indexes], y[part_indexes]
19 |
20 | def vectorized_result(j):
21 | """Return a 10-dimensional unit vector with a 1.0 in the jth
22 | position and zeroes elsewhere. This is used to convert a digit
23 | (0...9) into a corresponding desired output from the neural
24 | network."""
25 | e = np.zeros(10)
26 | e[j] = 1.0
27 | return e
28 |
29 | def vectorize(data):
30 | vector_y = [vectorized_result(y) for y in data[1]]
31 | return (data[0], np.array(vector_y))
32 | #return (data[0], data[1])
33 |
34 | def load_data_shared(filename, seed, train_size, vali_size, test_size):
35 | f = gzip.open(filename, 'rb')
36 | training_data, validation_data, test_data = pickle.load(f,encoding='bytes')
37 |
38 | return get_part(training_data, seed, train_size),\
39 | get_part(validation_data, seed, vali_size),\
40 | get_part(test_data, seed, test_size)
--------------------------------------------------------------------------------
/Chapter8/8-3-1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 动态调整学习率"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "```python\n",
15 | " scheduler = lr_scheduler.StepLR(net,step_size=5,gamma = 0.9)\n",
16 | " for epoch in range (param['epoch']):\n",
17 | " scheduler.step()\n",
18 | "```"
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "各种学习率衰减算法的表现: \n",
26 | "https://www.jianshu.com/p/9643cba47655"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": null,
32 | "metadata": {},
33 | "outputs": [],
34 | "source": []
35 | }
36 | ],
37 | "metadata": {
38 | "kernelspec": {
39 | "display_name": "Python 3",
40 | "language": "python",
41 | "name": "python3"
42 | },
43 | "language_info": {
44 | "codemirror_mode": {
45 | "name": "ipython",
46 | "version": 3
47 | },
48 | "file_extension": ".py",
49 | "mimetype": "text/x-python",
50 | "name": "python",
51 | "nbconvert_exporter": "python",
52 | "pygments_lexer": "ipython3",
53 | "version": "3.7.3"
54 | }
55 | },
56 | "nbformat": 4,
57 | "nbformat_minor": 2
58 | }
59 |
--------------------------------------------------------------------------------
/Chapter8/8-3-1.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter8/8-3-2.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter8/8-5-1.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter8/8-5-2.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter8/8-5-3.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import torch.nn as nn\n",
10 | "import torch.nn.functional as F\n",
11 | "from torch.autograd import Variable\n",
12 | "import torch as t"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 2,
18 | "metadata": {},
19 | "outputs": [],
20 | "source": [
21 | "class Net(nn.Module):\n",
22 | " def __init__(self):\n",
23 | " super(Net, self).__init__()\n",
24 | " \n",
25 | " self.fc1 = nn.Linear(28*28, 300)\n",
26 | " self.fc2 = nn.Linear(300, 10)\n",
27 | " \n",
28 | " def forward(self, x):\n",
29 | " x = x.view(x.shape[0], -1)\n",
30 | " x = F.relu(self.fc1(x))\n",
31 | " x = F.logsigmoid(self.fc2(x))\n",
32 | " return x"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 3,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "from mnist_loader import load_data_shared, vectorized_result\n",
42 | "training_data, validation_data, test_data = load_data_shared(filename=\"../mnist.pkl.gz\",\n",
43 | " seed=666,\n",
44 | " train_size=1000,\n",
45 | " vali_size=0,\n",
46 | " test_size=100)"
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 4,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "def predict(data, net):\n",
56 | " with t.no_grad():\n",
57 | " #for index in range(test_data[0].shape[0]):\n",
58 | " # get the inputs\n",
59 | " inputs, labels = t.Tensor(data[0]), data[1]\n",
60 | "\n",
61 | " # forward + backward + optimize\n",
62 | " outputs = net(inputs)\n",
63 | " _, predicted = t.max(outputs, 1)\n",
64 | "\n",
65 | " correct = (predicted == t.Tensor(labels)).sum().item()\n",
66 | " accuracy = correct / data[0].shape[0]\n",
67 | " return accuracy"
68 | ]
69 | },
70 | {
71 | "cell_type": "code",
72 | "execution_count": 5,
73 | "metadata": {},
74 | "outputs": [],
75 | "source": [
76 | "def fit(net, criterion, optimizer):\n",
77 | " loss_scores = []\n",
78 | " test_scores = []\n",
79 | " train_scores = []\n",
80 | " for epoch in range(100): # loop over the dataset multiple times\n",
81 | "\n",
82 | " # get the inputs\n",
83 | " inputs, labels = t.Tensor(training_data[0]), t.Tensor(training_data[1])\n",
84 | " vector_labels = t.Tensor([vectorized_result(y) for y in training_data[1]])\n",
85 | " # zero the parameter gradients\n",
86 | " optimizer.zero_grad()\n",
87 | "\n",
88 | " # forward + backward + optimize\n",
89 | " outputs = net(inputs)\n",
90 | " loss = criterion(outputs, labels.long())\n",
91 | " loss.backward()\n",
92 | " optimizer.step()\n",
93 | "\n",
94 | " # print statistics\n",
95 | " loss_scores.append(loss.item())\n",
96 | " train_scores.append(predict(training_data, net))\n",
97 | " test_scores.append(predict(test_data, net))\n",
98 | " print('Finished Training')\n",
99 | " return loss_scores, train_scores, test_scores"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "# ReLU + Sigmoid + Cross Entropy + L2"
107 | ]
108 | },
109 | {
110 | "cell_type": "code",
111 | "execution_count": 6,
112 | "metadata": {},
113 | "outputs": [
114 | {
115 | "name": "stdout",
116 | "output_type": "stream",
117 | "text": [
118 | "Finished Training\n"
119 | ]
120 | }
121 | ],
122 | "source": [
123 | "import torch.optim as optim\n",
124 | "net1 = Net()\n",
125 | "criterion1 = nn.CrossEntropyLoss()\n",
126 | "optimizer1 = optim.SGD(net1.parameters(), lr = 1e-1, weight_decay=1e-2)\n",
127 | "loss_scores1, train_scores1, test_scores1 = fit(net1, criterion1, optimizer1)"
128 | ]
129 | },
130 | {
131 | "cell_type": "code",
132 | "execution_count": 7,
133 | "metadata": {},
134 | "outputs": [
135 | {
136 | "data": {
137 | "text/plain": [
138 | ""
139 | ]
140 | },
141 | "metadata": {},
142 | "output_type": "display_data"
143 | }
144 | ],
145 | "source": [
146 | "import matplotlib.pyplot as plt\n",
147 | "\n",
148 | "plt.plot(loss_scores1)\n",
149 | "plt.show()"
150 | ]
151 | },
152 | {
153 | "cell_type": "code",
154 | "execution_count": 8,
155 | "metadata": {},
156 | "outputs": [
157 | {
158 | "data": {
159 | "image/png": "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\n",
160 | "text/plain": [
161 | ""
162 | ]
163 | },
164 | "metadata": {
165 | "needs_background": "light"
166 | },
167 | "output_type": "display_data"
168 | }
169 | ],
170 | "source": [
171 | "import matplotlib.pyplot as plt\n",
172 | "plt.plot(train_scores1)\n",
173 | "plt.plot(test_scores1)\n",
174 | "plt.show()"
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {},
180 | "source": [
181 | "# ReLU + Sigmoid + Cross Entropy + L2 + Adam"
182 | ]
183 | },
184 | {
185 | "cell_type": "code",
186 | "execution_count": 10,
187 | "metadata": {},
188 | "outputs": [
189 | {
190 | "name": "stdout",
191 | "output_type": "stream",
192 | "text": [
193 | "Finished Training\n"
194 | ]
195 | }
196 | ],
197 | "source": [
198 | "import torch.optim as optim\n",
199 | "net2 = Net()\n",
200 | "criterion2 = nn.CrossEntropyLoss()\n",
201 | "optimizer2 = optim.Adam(net2.parameters(), lr = 1e-3, weight_decay=1e-2)\n",
202 | "loss_scores2, train_scores2, test_scores2 = fit(net2, criterion2, optimizer2)"
203 | ]
204 | },
205 | {
206 | "cell_type": "code",
207 | "execution_count": 11,
208 | "metadata": {},
209 | "outputs": [
210 | {
211 | "data": {
212 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAdrElEQVR4nO3dd3hc9Z3v8fd3inqzrGJbcpFt3DDYGNkYHHpITFng0iF3KYE4BHJJQnZzSTbPpmx2s3fvBRJIQkIogYQSipeYEp4AoXe54gLYuEm2bMuWVSxZ1b/7x4xt2UiWbI10Zs58Xs8zj2bOOdJ8Dsd85sxvzpxjzjlERCTxBbwOICIisaFCFxHxCRW6iIhPqNBFRHxChS4i4hMhr564oKDAjRkzxqunFxFJSAsXLtzunCvsbp5nhT5mzBgqKiq8enoRkYRkZht6mqchFxERn1Chi4j4hApdRMQnVOgiIj6hQhcR8QkVuoiIT6jQRUR8IuEKfUt9Cz95dgXtnXu8jiIiElcSrtCXVNbx4NvrueuV1V5HERGJKwlX6HOnDuPiGaX8+tU1LNyw0+s4IiJxI+EKHeDH509heG46tz6xhKbWDq/jiIjEhYQs9Oy0MHdePp2Ntc387PlVXscREYkLCVnoALPK8vn6KeN47IONvLi82us4IiKeS9hCB7j1rAlMK83ln59axsYdzV7HERHxVEIXekoowK+umoEBNz+6iNaOTq8jiYh4JqELHWBkfga3XzadjzbV8+8aTxeRJJbwhQ5w1pRivnZyGQ+/u4EFSzd7HUdExBO+KHSA782dRPnoIdz29DLWbGv0Oo6IyKDzTaGHg5Hx9IyUIDf+aZGOTxeRpOObQgcYlpvGXVccx9qaXdw2/yOcc15HEhEZNL4qdICTxhfw3S9N5Nmlm3n43R6vpSoi4ju+K3SAb5w6jjMmFfGz51eytLLO6zgiIoPCl4UeCBi3XzqNouw0bn50EfXN7V5HEhEZcL4sdIAhmSncfdVxbKlv4Z+eWqrxdBHxPd8WOsCMUUO47exJvLRyKw+8vd7rOCIiA8rXhQ5w/RfK+OLkYv7zr6tYvqne6zgiIgPG94VuZvzXJceSn5nCLY8t1vHpIuJbvi90gPzMFO68fDrrdjTxk2dXeB1HRGRAJEWhA5w0roCbThvHExVVPLdM53sREf9JmkIH+PYXJzB9ZB4/fGY52xpavI4jIhJTSVXo4WCA2y+bRkt7J//76WU6lFFEfCWpCh1gXGEWt82dxKuf1PD4h5VexxERiZmkK3SAq08cw0njhvKz51ZSWatL14mIPyRloQcCxv+9dBoBM773lIZeRMQfei10MxtpZq+a2SozW2Fm3+pmGTOzu8xsjZktM7MZAxM3dkry0vn+OZN5d+0Onqyo8jqOiEi/9WUPvQP4rnNuMjAbuNnMphy0zNnAUdHbPOCemKYcIFfMHMmssnx+9vxKtjXqqBcRSWy9Frpzrto5tyh6vxFYBZQctNgFwMMu4j0gz8yGxzxtjAUCxs8vOoaWjj38ZMFKr+OIiPTLYY2hm9kY4Djg/YNmlQBdDxmp4vOlj5nNM7MKM6uoqak5vKQDZFxhFrecMZ7nP6rmbyu2eB1HROSI9bnQzSwLeBr4tnOu4eDZ3fzK5z5pdM7d65wrd86VFxYWHl7SATTvlHFMGpbNjxesYHdbp9dxRESOSJ8K3czCRMr8Eefc/G4WqQJGdnlcCiTM9+tTQgF+esFUNte38JvX1ngdR0TkiPTlKBcD7gdWOefu6GGxBcDV0aNdZgP1zrnqGOYccLPK8rlw+gh+9/pa1m9v8jqOiMhh68se+hzgH4EzzGxJ9HaOmd1oZjdGl3kBWAusAX4P3DQwcQfW98+ZTDho/Ntz+oBURBJPqLcFnHNv0f0YeddlHHBzrEJ5pTgnjW998Sj+44WPeWXVVs6cXOx1JBGRPkvKb4oeynVzyhhflMW/PbeS9s49XscREekzFfpBwsEAPzhnEut3NPPo+xu9jiMi0mcq9G6cPrGIE8cO5ZevrKahpd3rOCIifaJC74aZ8YNzJlPb1MbvXv/M6zgiIn2iQu/BMaW5XDh9BPe9uY7q+t1exxER6ZUK/RD+6csTcQ5u/9unXkcREemVCv0QSodkcM1Jo5m/qIrPanZ5HUdE5JBU6L248dRxpIWD3PXKaq+jiIgckgq9F0OzUrnmpDEsWLqZ1VsbvY4jItIjFXofzDt5LBnhIL/QXrqIxDEVeh8MyUzhujllPL+smo+3HHzmYBGR+KBC76MbTi4jOzXEL17SXrqIxCcVeh/lZaRw3ZwxvLhiC2u2aSxdROKPCv0wXDunjLRwgN++vtbrKCIin6NCPwz5mSlcMXMUzyzexOY6fXtUROKLCv0w3XByGQ64/611XkcRETmACv0wlQ7J4PxpI3jsg43UNbd5HUdEZB8V+hH4+qljaW7r5OF3N3gdRURkHxX6EZg0LIczJhXx4NvraGnv9DqOiAigQj9iXzt5LDub2/nLkk1eRxERAVToR2z22HwmDcvmwbfXE7lGtoiIt1ToR8jMuG7OGD7e0sh7a2u9jiMiokLvjwumlzAkI8yDb+sQRhHxngq9H9LCQa6cNYqXV22lsrbZ6zgikuRU6P30P2ePxsx4+N31XkcRkSSnQu+nEXnpzJ06jMc/rKS5rcPrOCKSxFToMXDNiWNobOnguaXVXkcRkSSmQo+BmWOGML4oi0c+2Oh1FBFJYir0GDAzrpo1iqWVdSzfVO91HBFJUir0GLl4RimpoQCPai9dRDyiQo+R3Iww5x07gr8s3sSuVn04KiKDT4UeQ1edMIqmtk4WLNnsdRQRSUIq9BiaMSqPScOyefQDnVZXRAafCj2GzIyrThjF8k0NfFSlD0dFZHCp0GPsguklpIYCPLmw0usoIpJkVOgxlpseZu7UYTyzeJMufiEig0qFPgAuKx9JQ0sHf1u51esoIpJEVOgD4MSxQynJS+fJCg27iMjg6bXQzewBM9tmZst7mH+amdWb2ZLo7V9jHzOxBALGpeWlvLVmO1U7dVpdERkcfdlD/wMwt5dl3nTOTY/eftr/WInvkuNLAXh6oa45KiKDo9dCd869Aegaa4epdEgGc8YV8OTCSvbs0TVHRWTgxWoM/UQzW2pmfzWzo2P0NxPepeWlVO3czXvrdngdRUSSQCwKfREw2jk3DbgbeKanBc1snplVmFlFTU1NDJ46vn356GFkp4Y07CIig6Lfhe6ca3DO7YrefwEIm1lBD8ve65wrd86VFxYW9vep415aOMi5xw7nr8uradIJu0RkgPW70M1smJlZ9P6s6N/UGEPUxceX0tzWyYvLt3gdRUR8LtTbAmb2GHAaUGBmVcCPgDCAc+63wCXAN8ysA9gNXOGc06eAUeWjhzB6aAZPL6ri4uiRLyIiA6HXQnfOXdnL/F8Bv4pZIp8xMy46rpRfvPIpm+p2U5KX7nUkEfEpfVN0EFw0owTn4L8XVXkdRUR8TIU+CEbmZ3BCWT5PL9qERqNEZKCo0AfJxceXsm57E4s21nkdRUR8SoU+SM45Zjhp4QDzNewiIgNEhT5IslJDzD16GM8u3azzpIvIgFChD6KLZpTS0NLB3z/e5nUUEfEhFfogmjO+gOKcVA27iMiAUKEPomDAuPC4El77pIbtu1q9jiMiPqNCH2QXHVdKxx7HgiWbvY4iIj6jQh9kE4dlM7Ukh/mLNewiIrGlQvfAxTNKWb6pgU+2NHodRUR8RIXugfOnjSAUMH04KiIxpUL3wNCsVE6fVMT8xZvo6NzjdRwR8QkVukcuOb6UmsZW3ljt/ys3icjgUKF75PSJReRnpvDUQg27iEhsqNA9khIKcOH0El5euY2dTW1exxERH1Che+iS40tp69zDs8t0TLqI9J8K3UNTRuQwZXiOhl1EJCZU6B675PhSllXV65h0Eek3FbrHLpg+gnDQeLKi0usoIpLgVOgeG5qVyllTipm/eBOtHTpPuogcORV6HLh85ihqm9p4aeVWr6OISAJToceBk8cXUJKXzp8/1LCLiBw5FXocCASMy8pH8ubq7VTWNnsdR0QSlAo9TlxaXkrA4Al9OCoiR0iFHidG5KVz6oRCnqio1Am7ROSIqNDjyOUzR7G1oZXXPtEJu0Tk8KnQ48iZk4sozE7lkfc3eB1FRBKQCj2OhIMBrpw1itc+rWHDjiav44hIglGhx5mvnDCKoBl/ek976SJyeFTocaY4J40vTx3Gnz+sZHebvjkqIn2nQo9DV88eTUNLBwuWbvI6iogkEBV6HJpVls+kYdk89M4GnHNexxGRBKFCj0Nmxj+eOJqV1Q0s2rjT6zgikiBU6HHqwuklZKeFeODt9V5HEZEEoUKPU5mpIa46YRR//aiajTt0fhcR6Z0KPY59dU4ZwYBx/1trvY4iIglAhR7HinPSuGB6CU9UVLGzqc3rOCIS51TocW7eKWPZ3d7JH/VFIxHpRa+FbmYPmNk2M1vew3wzs7vMbI2ZLTOzGbGPmbwmFGdz+sRCHnpnPS3t+qKRiPSsL3vofwDmHmL+2cBR0ds84J7+x5Ku5p0yjh1NbTy9qMrrKCISx3otdOfcG0DtIRa5AHjYRbwH5JnZ8FgFFJg9Np9pI/P47euf0a5zpYtID2Ixhl4CdL3MTlV02ueY2TwzqzCzipoanfO7r8yMb505nsra3czXXrqI9CAWhW7dTOv2++rOuXudc+XOufLCwsIYPHXyOH1iEdNKc7n772u0ly4i3YpFoVcBI7s8LgU2x+DvShdmxre/OIGqndpLF5HuxaLQFwBXR492mQ3UO+eqY/B35SCnTSzct5fe1qG9dBE5UF8OW3wMeBeYaGZVZna9md1oZjdGF3kBWAusAX4P3DRgaZOc9tJF5FBCvS3gnLuyl/kOuDlmieSQTptYyLSRefzyldVceFwJaeGg15FEJE7om6IJxsy4be4kqutbeODtdV7HEZE4okJPQCeOG8qZk4q459XP2LGr1es4IhInVOgJ6razJ9HU1sHdf1/jdRQRiRMq9AR1VHE2l88cxZ/e28D67U1exxGROKBCT2DfOesoUkIB/vOvH3sdRUTigAo9gRVlp3HTaeN4ccUW3vhUp1IQSXYq9AT3tVPGUlaQyY8WrKC1Q6fXFUlmKvQElxoK8pPzj2bd9ibufV2XqhNJZip0HzhlQiHnHjOcX726hspaXVBaJFmp0H3ih+dNJhgwfrRgBZEv74pIslGh+8Tw3HRuPWsCf/94G88s2eR1HBHxgArdR66bU0b56CH8eMFKtja0eB1HRAaZCt1HggHjvy45lpb2Tn4w/yMNvYgkGRW6z4wtzOKfvzyRVz7exvxFGnoRSSYqdB/aN/Ty7Aod9SKSRFToPhQMGHdcNh0c3PL4Yl2DVCRJqNB9atTQDH5+8TEs3ljHHS996nUcERkEKnQfO+/YEVw5axT3vPaZzvUikgRU6D73r+dNYUJxFrc+sYTq+t1exxGRAaRC97n0lCC/+coMWtr38PU/LqSlXSfwEvErFXoSGF+UzR2XTWNZVb2OTxfxMRV6kvjS0cO49awJzF+8ifvf0sWlRfxIhZ5Evnn6eOYePYz/eGEVL6/c6nUcEYkxFXoSCQSM2y+bxtSSXL752CIWb9zpdSQRiSEVepLJTA3xwLUzKc5J4/qHKlhbs8vrSCISIyr0JFSQlcpD183CgGse/EBnZhTxCRV6khpTkMn9186kdlcbV/7+PWoaW72OJCL9pEJPYtNH5vHgdbOormvhqt+/x45dKnWRRKZCT3KzyvJ54NqZVO5s5iv3va9SF0lgKnThxHFDue/qmazb3sSlv3uXzXU6RYBIIlKhCwBfOKqAP15/AjUNrVxyzzt8pqNfRBKOCl32mVWWz2PzZtPWuYfLfvsuSyrrvI4kIodBhS4HmFqSy5M3nkRGapDLf/cuzy7d7HUkEekjFbp8TllBJs/cNIdjSnL5X48t5pcvr9YJvUQSgApdujU0K5VHvnYCF80o4c6XP+XGPy2koaXd61gicggqdOlRaijI7ZdO41/OmczLq7Zx/t1vsXJzg9exRKQHKnQ5JDPja6eM5fF5s2lu6+R//OZt/vTeBg3BiMQhFbr0ycwx+Tx/y8nMKsvnh88s56t/+JBtjToHjEg8UaFLnxVmR07q9eN/mMI7n+3gy3e+wXPLNmtvXSRO9KnQzWyumX1iZmvM7LZu5l9rZjVmtiR6uyH2USUeBALGtXPKeP6WL1A6JINvPrqYGx6q0LdLReJAr4VuZkHg18DZwBTgSjOb0s2if3bOTY/e7otxTokz44uy+e+bTuKH507mnc92cNYdr3Pfm2tp69jjdTSRpNWXPfRZwBrn3FrnXBvwOHDBwMaSRBAKBrjh5LH87TunMKssn589v4q5v3yDVz/Z5nU0kaTUl0IvASq7PK6KTjvYxWa2zMyeMrOR3f0hM5tnZhVmVlFTU3MEcSUejczP4MHrZvHgtTPBwXUPfsjVD3zA8k31XkcTSSp9KXTrZtrBn4I9C4xxzh0LvAw81N0fcs7d65wrd86VFxYWHl5SiXunTyrixW+fwg/PncyyqjrOu/stbnpkIWu26URfIoOhL4VeBXTd4y4FDjjBh3Nuh3Nu74m0fw8cH5t4kmhSQpFhmDe+dzq3nDGe1z6p4aw7X+fmRxbpS0kiA6wvhf4hcJSZlZlZCnAFsKDrAmY2vMvD84FVsYsoiSgnLcytX5rIm987nW+cOo7XP63hnLve5Kt/+JB31mzXoY4iA8D68j+WmZ0D/AIIAg845/7dzH4KVDjnFpjZz4kUeQdQC3zDOffxof5meXm5q6io6PcKSGKob27noXfX89A769nR1MakYdl8dU4Z/zBtBOkpQa/jiSQMM1vonCvvdp5Xe0oq9OTU0t7JgiWbuf+tdXyytZHstBAXzyjlqhNGMaE42+t4InFPhS5xxznHB+tqeeT9jby4fAttnXs4piSXi2eUcP70EvIzU7yOKBKXVOgS13bsauWZJZt5emEVK6sbCAWMOeMLOO/Y4Xzp6GHkpoe9jigSN1TokjBWVTfwzJJNPL+smqqduwkHjZPGFfClo4s5a3IxRTlpXkcU8ZQKXRKOc44llXW88FE1f1u5lQ07mgGYWpLDaROKOG1iIdNH5hEK6vxyklxU6JLQnHOs3raLl1Zu5bVPtrFww072OMhODXHC2HzmjC9g9tihTCzOJhDo7ntwIv6hQhdfqW9u560123lrzXbe+Wz7vr333PQwM8cMYcboIcwYNYRppXk6JFJ851CFHhrsMCL9lZsR5txjh3PusZHvs1XtbOaDdbX7bi+vipwcLBgwJhZnc2xpLseW5jG1JIcJxdmkhVXy4k/aQxffqW1qY/HGnSzauJNlVfUsq6qnfnfkAtfBgDG+MItJw7OZOCybicXZTCjOpiQvXcM1khC0hy5JJT8zhTMnF3Pm5GIgMga/sbaZlZsbWFndwIrNDVSs38lfluw/JVFaOMDYgizGFWVRVpBJWUEGY4ZmMnpoJkMywpip7CX+qdDF98yM0dFyPvuY/acdamhp59Mtjazetos10dvSyjqeX7aZPV3euGanhhiZn8HI/HRKh2RQkpfOiLz06M808jNTVPgSF1TokrRy0sKUj8mnfEz+AdNbOzqprG1m/fZmNtQ2s3FHExtrm1lb08Qbn25nd3vnAcunBAMU56YyPCedopxUinPSKM5JpSg7jcLsVAqzUynISiUvPaxhHRlQKnSRg6SGgowvymZ80efPLeOco7apjer6FjbV7aa6bjfVDS1sqW+hur6FFZsbeGXVts+VPkTG74dmpjA0KzX6M4X8zBSGZqYwZO/PjMi0vIwU8jLChHWcvRwGFbrIYTCzSCFnpTK1JLfbZZxzNLZ2UNPYSk1jK9saW9mxq5Xtu1rZ3tjGjqY2djS1snFjM7VNbexq7ejx+bJTQ+RlhhmSkUJueuRnXkaYvPQwedFpeRmRW256mJz0MHnpKaSE9EKQjFToIjFmZuSkhclJCzOuMKvX5VvaO9nZ3EZtUxt1ze3saGqjrrmNnU3t7GyO3K/b3c7O5nYqa5up291O/e52DnWAWno4SG56eP8tI3zg4/QwOemh/ffT9r8g6LDOxKVCF/FYWjjI8Nx0huem9/l3Ovc4GlsixV7XHCn++t3tNEQf10dLf2/5V9Y2szw6v6nt88NBXaWGAvvKPVL2oQMe730ByOnyopCTFnnRyEoJ6XMCD6nQRRJQMGDRcfYURg89vN9t79xDw+79pV+/u52Glo59LwgNB0xvZ/uuNj6radr3+FDvDMwiw0Q5BxR/6IB3ADlpXeYftExGSlBHDPWDCl0kyYSDgX2fAxyuPXscu9o6Diz93R00tBz4YtD1BWLd9siLQWNLB829vDsIBozstBDZaaF9w1bZ0ReArvf3zw+RHZ2eHb2fzJ8fqNBFpM8Cgf2fD5QOOfzf3/vuoLEl8iKw9wVh7/BR1+mNLZEXjvU7mmhs6aCxpeOQHyDvlRYOREo+NVLyWWkhslPD++9H52VFXwSy9i6XGiYr+jgrNUQwAYeOVOgiMmj68+4AoKNzD02tnZF3BC37Sz9S+NGfrR0HPN7V2kFN467I/ej8vkgPB6MvBiEyoyWfGS3/zNRgZFrK/nkZe6elhshICe5bPjMlRFo4MChDSSp0EUkYoWCA3IwAuRlHfhWrvcNGu6Jlv7f8m1o7aWqNvENoau1kV+v+F4Sm1sjPTXW7993f1dpBW8eePj1nwCAzJVr6KSGuOmEUN5w89ojXoScqdBFJKl2HjfqrvXPPvoKPvAh00NzWse/Fobmtg6a2vfcjP5vaOik4wncovVGhi4gcoXAwsO9oo3iQvB8Hi4j4jApdRMQnVOgiIj6hQhcR8QkVuoiIT6jQRUR8QoUuIuITKnQREZ8wd6hzYQ7kE5vVABuO8NcLgO0xjJMoknG9k3GdITnXOxnXGQ5/vUc75wq7m+FZofeHmVU458q9zjHYknG9k3GdITnXOxnXGWK73hpyERHxCRW6iIhPJGqh3+t1AI8k43on4zpDcq53Mq4zxHC9E3IMXUREPi9R99BFROQgKnQREZ9IuEI3s7lm9omZrTGz27zOMxDMbKSZvWpmq8xshZl9Kzo938xeMrPV0Z9HcJne+GdmQTNbbGbPRR+Xmdn70fX+s5nFx9UEYsTM8szsKTP7OLrNT0yGbW1m34n++15uZo+ZWZoft7WZPWBm28xseZdp3W5fi7gr2m/LzGzG4TxXQhW6mQWBXwNnA1OAK81sirepBkQH8F3n3GRgNnBzdD1vA15xzh0FvBJ97EffAlZ1efx/gDuj670TuN6TVAPnl8CLzrlJwDQi6+7rbW1mJcAtQLlzbioQBK7An9v6D8Dcg6b1tH3PBo6K3uYB9xzOEyVUoQOzgDXOubXOuTbgceACjzPFnHOu2jm3KHq/kcj/4CVE1vWh6GIPARd6k3DgmFkpcC5wX/SxAWcAT0UX8dV6m1kOcApwP4Bzrs05V0cSbGsil8BMN7MQkAFU48Nt7Zx7A6g9aHJP2/cC4GEX8R6QZ2bD+/pciVboJUBll8dV0Wm+ZWZjgOOA94Fi51w1REofKPIu2YD5BfA9YO/l1IcCdc65juhjv23zsUAN8GB0mOk+M8vE59vaObcJ+H/ARiJFXg8sxN/buquetm+/Oi7RCt26mebb4y7NLAt4Gvi2c67B6zwDzczOA7Y55xZ2ndzNon7a5iFgBnCPc+44oAmfDa90JzpmfAFQBowAMokMNxzMT9u6L/r17z3RCr0KGNnlcSmw2aMsA8rMwkTK/BHn3Pzo5K17335Ff27zKt8AmQOcb2briQynnUFkjz0v+rYc/LfNq4Aq59z70cdPESl4v2/rLwLrnHM1zrl2YD5wEv7e1l31tH371XGJVugfAkdFPwlPIfIhygKPM8VcdNz4fmCVc+6OLrMWANdE718D/GWwsw0k59z3nXOlzrkxRLbt351zXwFeBS6JLuar9XbObQEqzWxidNKZwEp8vq2JDLXMNrOM6L/3vevt2219kJ627wLg6ujRLrOB+r1DM33inEuoG3AO8CnwGfAvXucZoHX8ApG3WcuAJdHbOUTGk18BVkd/5nuddQD/G5wGPBe9Pxb4AFgDPAmkep0vxus6HaiIbu9ngCHJsK2BnwAfA8uBPwKpftzWwGNEPidoJ7IHfn1P25fIkMuvo/32EZGjgPr8XPrqv4iITyTakIuIiPRAhS4i4hMqdBERn1Chi4j4hApdRMQnVOgiIj6hQhcR8Yn/D1p9sTU0kJKNAAAAAElFTkSuQmCC\n",
213 | "text/plain": [
214 | ""
215 | ]
216 | },
217 | "metadata": {
218 | "needs_background": "light"
219 | },
220 | "output_type": "display_data"
221 | }
222 | ],
223 | "source": [
224 | "import matplotlib.pyplot as plt\n",
225 | "\n",
226 | "plt.plot(loss_scores2)\n",
227 | "plt.show()"
228 | ]
229 | },
230 | {
231 | "cell_type": "code",
232 | "execution_count": 12,
233 | "metadata": {},
234 | "outputs": [
235 | {
236 | "data": {
237 | "image/png": "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\n",
238 | "text/plain": [
239 | ""
240 | ]
241 | },
242 | "metadata": {
243 | "needs_background": "light"
244 | },
245 | "output_type": "display_data"
246 | }
247 | ],
248 | "source": [
249 | "import matplotlib.pyplot as plt\n",
250 | "plt.plot(train_scores2)\n",
251 | "plt.plot(test_scores2)\n",
252 | "plt.show()"
253 | ]
254 | },
255 | {
256 | "cell_type": "markdown",
257 | "metadata": {},
258 | "source": [
259 | "# Adam效果"
260 | ]
261 | },
262 | {
263 | "cell_type": "code",
264 | "execution_count": 13,
265 | "metadata": {},
266 | "outputs": [
267 | {
268 | "data": {
269 | "image/png": "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\n",
270 | "text/plain": [
271 | ""
272 | ]
273 | },
274 | "metadata": {
275 | "needs_background": "light"
276 | },
277 | "output_type": "display_data"
278 | }
279 | ],
280 | "source": [
281 | "import matplotlib.pyplot as plt\n",
282 | "plt.plot(test_scores1)\n",
283 | "plt.plot(test_scores2)\n",
284 | "plt.show()"
285 | ]
286 | },
287 | {
288 | "cell_type": "markdown",
289 | "metadata": {},
290 | "source": [
291 | "Adam的效果明显要好。只是我看不懂原理。"
292 | ]
293 | },
294 | {
295 | "cell_type": "code",
296 | "execution_count": null,
297 | "metadata": {},
298 | "outputs": [],
299 | "source": []
300 | }
301 | ],
302 | "metadata": {
303 | "kernelspec": {
304 | "display_name": "Python 3",
305 | "language": "python",
306 | "name": "python3"
307 | },
308 | "language_info": {
309 | "codemirror_mode": {
310 | "name": "ipython",
311 | "version": 3
312 | },
313 | "file_extension": ".py",
314 | "mimetype": "text/x-python",
315 | "name": "python",
316 | "nbconvert_exporter": "python",
317 | "pygments_lexer": "ipython3",
318 | "version": "3.7.6"
319 | }
320 | },
321 | "nbformat": 4,
322 | "nbformat_minor": 2
323 | }
324 |
--------------------------------------------------------------------------------
/Chapter8/8-5-3.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Chapter8/mnist_loader.py:
--------------------------------------------------------------------------------
1 | #### Libraries
2 | # Standard library
3 | import pickle
4 | import gzip
5 |
6 | # Third-party libraries
7 | import numpy as np
8 |
9 | #### Load the MNIST data
10 | def get_part(data, seed, size):
11 | X, y = data
12 | n = X.shape[0]
13 | if n <= size:return data
14 | if seed:
15 | np.random.seed(seed)
16 | shuffle_indexes = np.random.permutation(n)
17 | part_indexes = shuffle_indexes[:size]
18 | return X[part_indexes], y[part_indexes]
19 |
20 | def vectorized_result(j):
21 | """Return a 10-dimensional unit vector with a 1.0 in the jth
22 | position and zeroes elsewhere. This is used to convert a digit
23 | (0...9) into a corresponding desired output from the neural
24 | network."""
25 | e = np.zeros(10)
26 | e[j] = 1.0
27 | return e
28 |
29 | def vectorize(data):
30 | vector_y = [vectorized_result(y) for y in data[1]]
31 | return (data[0], np.array(vector_y))
32 | #return (data[0], data[1])
33 |
34 | def load_data_shared(filename, seed, train_size, vali_size, test_size):
35 | f = gzip.open(filename, 'rb')
36 | training_data, validation_data, test_data = pickle.load(f,encoding='bytes')
37 |
38 | return get_part(training_data, seed, train_size),\
39 | get_part(validation_data, seed, vali_size),\
40 | get_part(test_data, seed, test_size)
--------------------------------------------------------------------------------
/Chapter9/mnist_loader.py:
--------------------------------------------------------------------------------
1 | #### Libraries
2 | # Standard library
3 | import pickle
4 | import gzip
5 |
6 | # Third-party libraries
7 | import numpy as np
8 |
9 | #### Load the MNIST data
10 | def get_part(data, seed, size):
11 | X, y = data
12 | n = X.shape[0]
13 | if n <= size:return data
14 | if seed:
15 | np.random.seed(seed)
16 | shuffle_indexes = np.random.permutation(n)
17 | part_indexes = shuffle_indexes[:size]
18 | return X[part_indexes], y[part_indexes]
19 |
20 | def vectorized_result(j):
21 | """Return a 10-dimensional unit vector with a 1.0 in the jth
22 | position and zeroes elsewhere. This is used to convert a digit
23 | (0...9) into a corresponding desired output from the neural
24 | network."""
25 | e = np.zeros(10)
26 | e[j] = 1.0
27 | return e
28 |
29 | def vectorize(data):
30 | vector_y = [vectorized_result(y) for y in data[1]]
31 | return (data[0], np.array(vector_y))
32 | #return (data[0], data[1])
33 |
34 | def load_data_shared(filename, seed, train_size, vali_size, test_size):
35 | f = gzip.open(filename, 'rb')
36 | training_data, validation_data, test_data = pickle.load(f,encoding='bytes')
37 |
38 | return get_part(training_data, seed, train_size),\
39 | get_part(validation_data, seed, vali_size),\
40 | get_part(test_data, seed, test_size)
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # play-with-handwritten-digits
2 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Table of contents
2 |
3 | * [Introduction](README.md)
4 | * 第6章 深度前馈网络
5 | * 6.2 基于梯度的学习
6 | * [6.2.2.1 用于高斯输出分布的线性神单元](Chapter6/6-2-2-1.md)
7 | * [深度线性网络实验](Chapter6/deep-linear-network.md)
8 | * [6.2.2.2 用于Bernoulli输出分布的sigmoid单元](Chapter6/6-2-2-2.md)
9 | * [6.2.2.3 用于Multinoulli输出分布的softmax单元](Chapter6/6-2-2-3.md)
10 | * 6.3 隐藏单元
11 | * [6.3.1 ReLU及其扩展](Chapter6/6-3-1.md)
12 | * [6.3.2 logistic sigmoid与双曲正切函数](Chapter6/6-3-2.md)
13 | * 第7章 深度学习中的正则化
14 | * 7.1 参数范数惩罚
15 | * [7.1.1 L2参数正则化](Chapter7/7-1-1.md)
16 | * [7.1.2 L1参数正则化](Chapter7/7-1-2.md)
17 | * [7.8 提前终止](Chapter7/7-8.md)
18 | * [7.11 Bagging 和其他集成方法](Chapter7/7-11.md)
19 | * [7.12 Dropout](Chapter7/7-12.md)
20 | * [第8章 深度模型中的优化](Chapter8/0Optimization.md)
21 | * 8.3 基本算法
22 | * [8.3.1 随机梯度下降](Chapter8/8-3-1.md)
23 | * [8.3.2 动量](Chapter8/8-3-2.md)
24 | * 8.5 自适应学习率算法
25 | * [8.5.1 AdaGrad](Chapter8/8-5-1.md)
26 | * [8.5.2 RMSProp](Chapter8/8-5-2.md)
27 | * 第11章 实践方法论
28 | * [11.2 默认的基准模型](Chapter11/11-2.md)
29 | * 第12章 应用
30 | * 12.1 大规模深度学习
31 | * [12.1.2 GPU 实现](Chapter12/12-1-2.md)
32 |
--------------------------------------------------------------------------------
/book.json:
--------------------------------------------------------------------------------
1 | {
2 | "gitbook": "3.2.3",
3 | "author": "windmissing",
4 | "plugins": [
5 | "katex",
6 | "alerts",
7 | "mygitalk",
8 | "github",
9 | "github-buttons",
10 | "splitter",
11 | "-sharing", "sharing-plus",
12 | "donate",
13 | "copy-code-button",
14 | "anchor-navigation-ex",
15 | "sectionx",
16 | "click-reveal"
17 | ],
18 | "pluginsConfig": {
19 | "mygitalk": {
20 | "clientID": "43dbd838dc1b0ba757f1",
21 | "clientSecret": "7029e5dabc2cb6bf3d538efcc461c6219239cecc",
22 | "repo": "DeepLearningPractise",
23 | "owner": "windmissing",
24 | "admin": ["windmissing"],
25 | "distractionFreeMode": false
26 | },
27 | "github": {
28 | "url": "https://github.com/windmissing/DeepLearningPractise"
29 | },
30 | "github-buttons": {
31 | "repo": "windmissing/DeepLearningPractise",
32 | "types": [
33 | "star",
34 | "watch",
35 | "fork"
36 | ],
37 | "size": "small"
38 | },
39 | "donate": {
40 | "wechat": "http://windmissing.github.io/images/2020/weixin.jpg",
41 | "alipay": "http://windmissing.github.io/images/2020/alipay.jpg",
42 | "title": "",
43 | "button": "赏",
44 | "alipayText": "支付宝打赏",
45 | "wechatText": "微信打赏"
46 | },
47 | "anchor-navigation-ex": {
48 | "isShowTocTitleIcon": true,
49 | "tocLevel1Icon": "fa fa-hand-o-right",
50 | "tocLevel2Icon": "fa fa-hand-o-right",
51 | "tocLevel3Icon": "fa fa-hand-o-right"
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/mnist.pkl.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/windmissing/DeepLearningPractise/0f324b5caa82a52bb44ba6749cd68572e0b36f6d/mnist.pkl.gz
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "array-union": {
6 | "version": "1.0.2",
7 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
8 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
9 | "requires": {
10 | "array-uniq": "^1.0.1"
11 | }
12 | },
13 | "array-uniq": {
14 | "version": "1.0.3",
15 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
16 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
17 | },
18 | "async": {
19 | "version": "2.6.3",
20 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
21 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
22 | "requires": {
23 | "lodash": "^4.17.14"
24 | },
25 | "dependencies": {
26 | "lodash": {
27 | "version": "4.17.15",
28 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
29 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
30 | }
31 | }
32 | },
33 | "balanced-match": {
34 | "version": "1.0.0",
35 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
36 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
37 | },
38 | "boolbase": {
39 | "version": "1.0.0",
40 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
41 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
42 | },
43 | "brace-expansion": {
44 | "version": "1.1.11",
45 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
46 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
47 | "requires": {
48 | "balanced-match": "^1.0.0",
49 | "concat-map": "0.0.1"
50 | }
51 | },
52 | "commander": {
53 | "version": "2.20.3",
54 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
55 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
56 | },
57 | "concat-map": {
58 | "version": "0.0.1",
59 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
60 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
61 | },
62 | "debug": {
63 | "version": "3.2.6",
64 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
65 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
66 | "requires": {
67 | "ms": "^2.1.1"
68 | }
69 | },
70 | "domelementtype": {
71 | "version": "1.3.1",
72 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
73 | "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8="
74 | },
75 | "email-addresses": {
76 | "version": "3.1.0",
77 | "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
78 | "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg=="
79 | },
80 | "entities": {
81 | "version": "1.1.2",
82 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
83 | "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY="
84 | },
85 | "es5-ext": {
86 | "version": "0.10.53",
87 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
88 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
89 | "dev": true,
90 | "requires": {
91 | "es6-iterator": "~2.0.3",
92 | "es6-symbol": "~3.1.3",
93 | "next-tick": "~1.0.0"
94 | }
95 | },
96 | "es6-iterator": {
97 | "version": "2.0.3",
98 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
99 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
100 | "dev": true,
101 | "requires": {
102 | "d": "1",
103 | "es5-ext": "^0.10.35",
104 | "es6-symbol": "^3.1.1"
105 | },
106 | "dependencies": {
107 | "d": {
108 | "version": "1.0.1",
109 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
110 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
111 | "dev": true,
112 | "requires": {
113 | "es5-ext": "^0.10.50",
114 | "type": "^1.0.1"
115 | }
116 | }
117 | }
118 | },
119 | "es6-symbol": {
120 | "version": "3.1.3",
121 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
122 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
123 | "dev": true,
124 | "requires": {
125 | "d": "^1.0.1",
126 | "ext": "^1.1.2"
127 | },
128 | "dependencies": {
129 | "d": {
130 | "version": "1.0.1",
131 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
132 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
133 | "dev": true,
134 | "requires": {
135 | "es5-ext": "^0.10.50",
136 | "type": "^1.0.1"
137 | }
138 | }
139 | }
140 | },
141 | "escape-string-regexp": {
142 | "version": "1.0.5",
143 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
144 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
145 | },
146 | "ext": {
147 | "version": "1.4.0",
148 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
149 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
150 | "dev": true,
151 | "requires": {
152 | "type": "^2.0.0"
153 | },
154 | "dependencies": {
155 | "type": {
156 | "version": "2.0.0",
157 | "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
158 | "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
159 | "dev": true
160 | }
161 | }
162 | },
163 | "filename-reserved-regex": {
164 | "version": "1.0.0",
165 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
166 | "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q="
167 | },
168 | "filenamify": {
169 | "version": "1.2.1",
170 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
171 | "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
172 | "requires": {
173 | "filename-reserved-regex": "^1.0.0",
174 | "strip-outer": "^1.0.0",
175 | "trim-repeated": "^1.0.0"
176 | }
177 | },
178 | "filenamify-url": {
179 | "version": "1.0.0",
180 | "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz",
181 | "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=",
182 | "requires": {
183 | "filenamify": "^1.0.0",
184 | "humanize-url": "^1.0.0"
185 | }
186 | },
187 | "fs-extra": {
188 | "version": "8.1.0",
189 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
190 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
191 | "requires": {
192 | "graceful-fs": "^4.2.0",
193 | "jsonfile": "^4.0.0",
194 | "universalify": "^0.1.0"
195 | }
196 | },
197 | "fs.realpath": {
198 | "version": "1.0.0",
199 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
200 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
201 | },
202 | "g": {
203 | "version": "2.0.1",
204 | "resolved": "https://registry.npmjs.org/g/-/g-2.0.1.tgz",
205 | "integrity": "sha1-C1lj69DKcOO8jGdmk0oCGCHIuFc="
206 | },
207 | "gh-pages": {
208 | "version": "2.2.0",
209 | "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.2.0.tgz",
210 | "integrity": "sha512-c+yPkNOPMFGNisYg9r4qvsMIjVYikJv7ImFOhPIVPt0+AcRUamZ7zkGRLHz7FKB0xrlZ+ddSOJsZv9XAFVXLmA==",
211 | "requires": {
212 | "async": "^2.6.1",
213 | "commander": "^2.18.0",
214 | "email-addresses": "^3.0.1",
215 | "filenamify-url": "^1.0.0",
216 | "fs-extra": "^8.1.0",
217 | "globby": "^6.1.0"
218 | }
219 | },
220 | "gitbook-plugin-alerts": {
221 | "version": "0.2.0",
222 | "resolved": "https://registry.npmjs.org/gitbook-plugin-alerts/-/gitbook-plugin-alerts-0.2.0.tgz",
223 | "integrity": "sha1-yMd4tBeY+AiwO+uQiCLpKKT74Tc="
224 | },
225 | "glob": {
226 | "version": "7.1.6",
227 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
228 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
229 | "requires": {
230 | "fs.realpath": "^1.0.0",
231 | "inflight": "^1.0.4",
232 | "inherits": "2",
233 | "minimatch": "^3.0.4",
234 | "once": "^1.3.0",
235 | "path-is-absolute": "^1.0.0"
236 | }
237 | },
238 | "globby": {
239 | "version": "6.1.0",
240 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
241 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
242 | "requires": {
243 | "array-union": "^1.0.1",
244 | "glob": "^7.0.3",
245 | "object-assign": "^4.0.1",
246 | "pify": "^2.0.0",
247 | "pinkie-promise": "^2.0.0"
248 | }
249 | },
250 | "graceful-fs": {
251 | "version": "4.2.3",
252 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
253 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
254 | },
255 | "humanize-url": {
256 | "version": "1.0.1",
257 | "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz",
258 | "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=",
259 | "requires": {
260 | "normalize-url": "^1.0.0",
261 | "strip-url-auth": "^1.0.0"
262 | }
263 | },
264 | "inflight": {
265 | "version": "1.0.6",
266 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
267 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
268 | "requires": {
269 | "once": "^1.3.0",
270 | "wrappy": "1"
271 | }
272 | },
273 | "inherits": {
274 | "version": "2.0.4",
275 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
276 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
277 | },
278 | "is-plain-obj": {
279 | "version": "1.1.0",
280 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
281 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
282 | },
283 | "jsonfile": {
284 | "version": "4.0.0",
285 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
286 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
287 | "requires": {
288 | "graceful-fs": "^4.1.6"
289 | }
290 | },
291 | "lodash": {
292 | "version": "3.10.1",
293 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
294 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
295 | },
296 | "minimatch": {
297 | "version": "3.0.4",
298 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
299 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
300 | "requires": {
301 | "brace-expansion": "^1.1.7"
302 | }
303 | },
304 | "ms": {
305 | "version": "2.1.2",
306 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
307 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
308 | },
309 | "next-tick": {
310 | "version": "1.0.0",
311 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
312 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
313 | "dev": true
314 | },
315 | "normalize-url": {
316 | "version": "1.9.1",
317 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
318 | "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
319 | "requires": {
320 | "object-assign": "^4.0.1",
321 | "prepend-http": "^1.0.0",
322 | "query-string": "^4.1.0",
323 | "sort-keys": "^1.0.0"
324 | }
325 | },
326 | "nth-check": {
327 | "version": "1.0.2",
328 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
329 | "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=",
330 | "requires": {
331 | "boolbase": "~1.0.0"
332 | }
333 | },
334 | "object-assign": {
335 | "version": "4.1.1",
336 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
337 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
338 | },
339 | "once": {
340 | "version": "1.4.0",
341 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
342 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
343 | "requires": {
344 | "wrappy": "1"
345 | }
346 | },
347 | "path-is-absolute": {
348 | "version": "1.0.1",
349 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
350 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
351 | },
352 | "pify": {
353 | "version": "2.3.0",
354 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
355 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
356 | },
357 | "pinkie": {
358 | "version": "2.0.4",
359 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
360 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
361 | },
362 | "pinkie-promise": {
363 | "version": "2.0.1",
364 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
365 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
366 | "requires": {
367 | "pinkie": "^2.0.0"
368 | }
369 | },
370 | "prepend-http": {
371 | "version": "1.0.4",
372 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
373 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
374 | },
375 | "query-string": {
376 | "version": "4.3.4",
377 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
378 | "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
379 | "requires": {
380 | "object-assign": "^4.1.0",
381 | "strict-uri-encode": "^1.0.0"
382 | }
383 | },
384 | "safe-buffer": {
385 | "version": "5.2.0",
386 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
387 | "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk="
388 | },
389 | "sort-keys": {
390 | "version": "1.1.2",
391 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
392 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
393 | "requires": {
394 | "is-plain-obj": "^1.0.0"
395 | }
396 | },
397 | "strict-uri-encode": {
398 | "version": "1.1.0",
399 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
400 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
401 | },
402 | "strip-outer": {
403 | "version": "1.0.1",
404 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
405 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
406 | "requires": {
407 | "escape-string-regexp": "^1.0.2"
408 | }
409 | },
410 | "strip-url-auth": {
411 | "version": "1.0.1",
412 | "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz",
413 | "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164="
414 | },
415 | "trim-repeated": {
416 | "version": "1.0.0",
417 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
418 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
419 | "requires": {
420 | "escape-string-regexp": "^1.0.2"
421 | }
422 | },
423 | "type": {
424 | "version": "1.2.0",
425 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
426 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
427 | "dev": true
428 | },
429 | "universalify": {
430 | "version": "0.1.2",
431 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
432 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
433 | },
434 | "util-deprecate": {
435 | "version": "1.0.2",
436 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
437 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
438 | },
439 | "wrappy": {
440 | "version": "1.0.2",
441 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
442 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
443 | }
444 | }
445 | }
446 |
--------------------------------------------------------------------------------