|
89 | 89 | " # nn.Module子类的函数必须在构造函数中执行父类的构造函数\n",
|
90 | 90 | " super(Net, self).__init__()\n",
|
91 | 91 | " \n",
|
92 |
| - " # 卷积层 '1'表示输入图片为单通道, '6'表示输出通道数,'5'表示卷积核为3*3\n", |
| 92 | + " # 卷积层 '1'表示输入图片为单通道, '6'表示输出通道数,'3'表示卷积核为3*3\n", |
93 | 93 | " self.conv1 = nn.Conv2d(1, 6, 3) \n",
|
94 |
| - " #线性层,输入84个特征,输出10个特征\n", |
95 |
| - " self.fc1 = nn.Linear(1350, 10)\n", |
96 |
| - " #正向传播\n", |
| 94 | + " #线性层,输入1350个特征,输出10个特征\n", |
| 95 | + " self.fc1 = nn.Linear(1350, 10) #这里的1350是如何计算的呢?这就要看后面的forward函数\n", |
| 96 | + " #正向传播 \n", |
97 | 97 | " def forward(self, x): \n",
|
| 98 | + " print(x.size()) # 结果:[1, 1, 32, 32]\n", |
98 | 99 | " # 卷积 -> 激活 -> 池化 \n",
|
99 |
| - " x = self.conv1(x)\n", |
| 100 | + " x = self.conv1(x) #根据卷积的尺寸计算公式,计算结果是30,具体计算公式后面第二张第四节 卷积神经网络 有详细介绍。\n", |
100 | 101 | " x = F.relu(x)\n",
|
101 |
| - " x = F.max_pool2d(x, (2, 2))\n", |
| 102 | + " print(x.size()) # 结果:[1, 6, 30, 30]\n", |
| 103 | + " x = F.max_pool2d(x, (2, 2)) #我们使用池化层,计算结果是15\n", |
102 | 104 | " x = F.relu(x)\n",
|
| 105 | + " print(x.size()) # 结果:[1, 6, 15, 15]\n", |
103 | 106 | " # reshape,‘-1’表示自适应\n",
|
| 107 | + " #这里做的就是压扁的操作 就是把后面的[1, 6, 15, 15]压扁,变为 [1, 1350]\n", |
104 | 108 | " x = x.view(x.size()[0], -1) \n",
|
| 109 | + " print(x.size()) # 这里就是fc1层的的输入1350 \n", |
105 | 110 | " x = self.fc1(x) \n",
|
106 | 111 | " return x\n",
|
107 | 112 | "\n",
|
|
128 | 133 | "output_type": "stream",
|
129 | 134 | "text": [
|
130 | 135 | "Parameter containing:\n",
|
131 |
| - "tensor([[[[-0.2569, 0.3030, -0.2508],\n", |
132 |
| - " [ 0.2527, 0.3013, -0.1692],\n", |
133 |
| - " [ 0.0445, 0.0929, 0.2674]]],\n", |
| 136 | + "tensor([[[[ 0.2745, 0.2594, 0.0171],\n", |
| 137 | + " [ 0.0429, 0.3013, -0.0208],\n", |
| 138 | + " [ 0.1459, -0.3223, 0.1797]]],\n", |
134 | 139 | "\n",
|
135 | 140 | "\n",
|
136 |
| - " [[[-0.1670, -0.3166, 0.3315],\n", |
137 |
| - " [ 0.1171, 0.3244, -0.2757],\n", |
138 |
| - " [ 0.2158, -0.3002, -0.1742]]],\n", |
| 141 | + " [[[ 0.1847, 0.0227, -0.1919],\n", |
| 142 | + " [-0.0210, -0.1336, -0.2176],\n", |
| 143 | + " [-0.2164, -0.1244, -0.2428]]],\n", |
139 | 144 | "\n",
|
140 | 145 | "\n",
|
141 |
| - " [[[-0.1313, 0.2859, 0.1639],\n", |
142 |
| - " [-0.0260, 0.2024, -0.1361],\n", |
143 |
| - " [-0.1011, -0.1267, 0.2546]]],\n", |
| 146 | + " [[[ 0.1042, -0.0055, -0.2171],\n", |
| 147 | + " [ 0.3306, -0.2808, 0.2058],\n", |
| 148 | + " [ 0.2492, 0.2971, 0.2277]]],\n", |
144 | 149 | "\n",
|
145 | 150 | "\n",
|
146 |
| - " [[[-0.0267, 0.2839, -0.2581],\n", |
147 |
| - " [-0.2461, -0.0073, 0.3096],\n", |
148 |
| - " [ 0.2565, -0.2553, 0.3148]]],\n", |
| 151 | + " [[[ 0.2134, -0.0644, -0.3044],\n", |
| 152 | + " [ 0.0040, 0.0828, -0.2093],\n", |
| 153 | + " [ 0.0204, 0.1065, 0.1168]]],\n", |
149 | 154 | "\n",
|
150 | 155 | "\n",
|
151 |
| - " [[[ 0.0848, -0.3026, -0.2878],\n", |
152 |
| - " [ 0.1124, 0.0947, -0.3182],\n", |
153 |
| - " [-0.1941, -0.2659, 0.1424]]],\n", |
| 156 | + " [[[ 0.1651, -0.2244, 0.3072],\n", |
| 157 | + " [-0.2301, 0.2443, -0.2340],\n", |
| 158 | + " [ 0.0685, 0.1026, 0.1754]]],\n", |
154 | 159 | "\n",
|
155 | 160 | "\n",
|
156 |
| - " [[[-0.0537, 0.0605, -0.2139],\n", |
157 |
| - " [ 0.2403, -0.1542, 0.0416],\n", |
158 |
| - " [ 0.0483, 0.1220, -0.1305]]]], requires_grad=True)\n", |
| 161 | + " [[[ 0.1691, -0.0790, 0.2617],\n", |
| 162 | + " [ 0.1956, 0.1477, 0.0877],\n", |
| 163 | + " [ 0.0538, -0.3091, 0.2030]]]], requires_grad=True)\n", |
159 | 164 | "Parameter containing:\n",
|
160 |
| - "tensor([ 0.3156, -0.1656, -0.0010, -0.1745, 0.0580, 0.0558], requires_grad=True)\n", |
| 165 | + "tensor([ 0.2355, 0.2949, -0.1283, -0.0848, 0.2027, -0.3331],\n", |
| 166 | + " requires_grad=True)\n", |
161 | 167 | "Parameter containing:\n",
|
162 |
| - "tensor([[-0.0126, 0.0179, 0.0082, ..., 0.0023, 0.0091, -0.0069],\n", |
163 |
| - " [ 0.0142, 0.0079, 0.0038, ..., 0.0081, -0.0236, 0.0226],\n", |
164 |
| - " [-0.0068, 0.0093, 0.0153, ..., -0.0085, -0.0012, -0.0122],\n", |
| 168 | + "tensor([[ 2.0555e-02, -2.1445e-02, -1.7981e-02, ..., -2.3864e-02,\n", |
| 169 | + " 8.5149e-03, -6.2071e-04],\n", |
| 170 | + " [-1.1755e-02, 1.0010e-02, 2.1978e-02, ..., 1.8433e-02,\n", |
| 171 | + " 7.1362e-03, -4.0951e-03],\n", |
| 172 | + " [ 1.6187e-02, 2.1623e-02, 1.1840e-02, ..., 5.7059e-03,\n", |
| 173 | + " -2.7165e-02, 1.3463e-03],\n", |
165 | 174 | " ...,\n",
|
166 |
| - " [-0.0071, 0.0234, -0.0262, ..., -0.0010, -0.0241, -0.0068],\n", |
167 |
| - " [ 0.0203, -0.0004, 0.0267, ..., -0.0173, 0.0022, -0.0237],\n", |
168 |
| - " [ 0.0247, 0.0200, -0.0201, ..., 0.0081, 0.0236, 0.0140]],\n", |
169 |
| - " requires_grad=True)\n", |
| 175 | + " [-3.2552e-03, 1.7277e-02, -1.4907e-02, ..., 7.4232e-03,\n", |
| 176 | + " -2.7188e-02, -4.6431e-03],\n", |
| 177 | + " [-1.9786e-02, -3.7382e-03, 1.2259e-02, ..., 3.2471e-03,\n", |
| 178 | + " -1.2375e-02, -1.6372e-02],\n", |
| 179 | + " [-8.2350e-03, 4.1301e-03, -1.9192e-03, ..., -2.3119e-05,\n", |
| 180 | + " 2.0167e-03, 1.9528e-02]], requires_grad=True)\n", |
170 | 181 | "Parameter containing:\n",
|
171 |
| - "tensor([ 0.0198, -0.0144, -0.0156, -0.0073, 0.0185, -0.0177, -0.0012, -0.0125,\n", |
172 |
| - " -0.0136, 0.0125], requires_grad=True)\n" |
| 182 | + "tensor([ 0.0162, -0.0146, -0.0218, 0.0212, -0.0119, -0.0142, -0.0079, 0.0171,\n", |
| 183 | + " 0.0205, 0.0164], requires_grad=True)\n" |
173 | 184 | ]
|
174 | 185 | }
|
175 | 186 | ],
|
|
218 | 229 | "execution_count": 6,
|
219 | 230 | "metadata": {},
|
220 | 231 | "outputs": [
|
| 232 | + { |
| 233 | + "name": "stdout", |
| 234 | + "output_type": "stream", |
| 235 | + "text": [ |
| 236 | + "torch.Size([1, 1, 32, 32])\n", |
| 237 | + "torch.Size([1, 6, 30, 30])\n", |
| 238 | + "torch.Size([1, 6, 15, 15])\n", |
| 239 | + "torch.Size([1, 1350])\n" |
| 240 | + ] |
| 241 | + }, |
221 | 242 | {
|
222 | 243 | "data": {
|
223 | 244 | "text/plain": [
|
|
230 | 251 | }
|
231 | 252 | ],
|
232 | 253 | "source": [
|
233 |
| - "input = torch.randn(1, 1, 32, 32)\n", |
| 254 | + "input = torch.randn(1, 1, 32, 32) # 这里的对应前面fforward的输入是32\n", |
234 | 255 | "out = net(input)\n",
|
235 | 256 | "out.size()"
|
236 | 257 | ]
|
237 | 258 | },
|
| 259 | + { |
| 260 | + "cell_type": "code", |
| 261 | + "execution_count": 7, |
| 262 | + "metadata": {}, |
| 263 | + "outputs": [ |
| 264 | + { |
| 265 | + "data": { |
| 266 | + "text/plain": [ |
| 267 | + "torch.Size([1, 1, 32, 32])" |
| 268 | + ] |
| 269 | + }, |
| 270 | + "execution_count": 7, |
| 271 | + "metadata": {}, |
| 272 | + "output_type": "execute_result" |
| 273 | + } |
| 274 | + ], |
| 275 | + "source": [ |
| 276 | + "input.size()" |
| 277 | + ] |
| 278 | + }, |
238 | 279 | {
|
239 | 280 | "cell_type": "markdown",
|
240 | 281 | "metadata": {},
|
|
244 | 285 | },
|
245 | 286 | {
|
246 | 287 | "cell_type": "code",
|
247 |
| - "execution_count": 7, |
| 288 | + "execution_count": 8, |
248 | 289 | "metadata": {},
|
249 | 290 | "outputs": [],
|
250 | 291 | "source": [
|
|
271 | 312 | },
|
272 | 313 | {
|
273 | 314 | "cell_type": "code",
|
274 |
| - "execution_count": 8, |
| 315 | + "execution_count": 9, |
275 | 316 | "metadata": {},
|
276 | 317 | "outputs": [
|
277 | 318 | {
|
278 | 319 | "name": "stdout",
|
279 | 320 | "output_type": "stream",
|
280 | 321 | "text": [
|
281 |
| - "29.04529571533203\n" |
| 322 | + "28.92203712463379\n" |
282 | 323 | ]
|
283 | 324 | }
|
284 | 325 | ],
|
|
304 | 345 | },
|
305 | 346 | {
|
306 | 347 | "cell_type": "code",
|
307 |
| - "execution_count": 9, |
| 348 | + "execution_count": 10, |
308 | 349 | "metadata": {},
|
309 | 350 | "outputs": [],
|
310 | 351 | "source": [
|
|
313 | 354 | },
|
314 | 355 | {
|
315 | 356 | "cell_type": "code",
|
316 |
| - "execution_count": 10, |
| 357 | + "execution_count": 11, |
317 | 358 | "metadata": {},
|
318 |
| - "outputs": [], |
| 359 | + "outputs": [ |
| 360 | + { |
| 361 | + "name": "stdout", |
| 362 | + "output_type": "stream", |
| 363 | + "text": [ |
| 364 | + "torch.Size([1, 1, 32, 32])\n", |
| 365 | + "torch.Size([1, 6, 30, 30])\n", |
| 366 | + "torch.Size([1, 6, 15, 15])\n", |
| 367 | + "torch.Size([1, 1350])\n" |
| 368 | + ] |
| 369 | + } |
| 370 | + ], |
319 | 371 | "source": [
|
320 |
| - "out = net(input)\n", |
| 372 | + "out = net(input) # 这里调用的时候会打印出我们在forword函数中打印的x的大小\n", |
321 | 373 | "criterion = nn.MSELoss()\n",
|
322 | 374 | "loss = criterion(out, y)\n",
|
323 | 375 | "#新建一个优化器,SGD只需要要调整的参数和学习率\n",
|
|
334 | 386 | "cell_type": "markdown",
|
335 | 387 | "metadata": {},
|
336 | 388 | "source": [
|
337 |
| - "这样,神经网络的数据的一个完整的传播就已经通过PyTorch实现了,下面一章将介绍PyTorch提供的数据加载和处理工具,使用这些工具可以方便的处理所需要的数据" |
| 389 | + "这样,神经网络的数据的一个完整的传播就已经通过PyTorch实现了,下面一章将介绍PyTorch提供的数据加载和处理工具,使用这些工具可以方便的处理所需要的数据。\n", |
| 390 | + "\n", |
| 391 | + "看完这节,大家可能对神经网络模型里面的一些参数的计算方式还有疑惑,这部分会在第二张第四节 卷积神经网络 有详细介绍,并且在第三章 第二节 MNIST数据集手写数字识别 的实践代码中有详细的注释说明。" |
338 | 392 | ]
|
| 393 | + }, |
| 394 | + { |
| 395 | + "cell_type": "code", |
| 396 | + "execution_count": null, |
| 397 | + "metadata": {}, |
| 398 | + "outputs": [], |
| 399 | + "source": [] |
339 | 400 | }
|
340 | 401 | ],
|
341 | 402 | "metadata": {
|
342 | 403 | "kernelspec": {
|
343 |
| - "display_name": "Pytorch for Deeplearning", |
| 404 | + "display_name": "pytorch 1.0", |
344 | 405 | "language": "python",
|
345 |
| - "name": "pytorch" |
| 406 | + "name": "pytorch1" |
346 | 407 | },
|
347 | 408 | "language_info": {
|
348 | 409 | "codemirror_mode": {
|
|
354 | 415 | "name": "python",
|
355 | 416 | "nbconvert_exporter": "python",
|
356 | 417 | "pygments_lexer": "ipython3",
|
357 |
| - "version": "3.6.7" |
| 418 | + "version": "3.6.6" |
358 | 419 | }
|
359 | 420 | },
|
360 | 421 | "nbformat": 4,
|
|
0 commit comments