diff --git a/appendix-A/03_main-chapter-code/exercise-solutions.ipynb b/appendix-A/03_main-chapter-code/exercise-solutions.ipynb new file mode 100644 index 0000000..4c49997 --- /dev/null +++ b/appendix-A/03_main-chapter-code/exercise-solutions.ipynb @@ -0,0 +1,171 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 练习 A.3" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "\n", + "class NeuralNetwork(torch.nn.Module):\n", + " def __init__(self, num_inputs, num_outputs):\n", + " super().__init__()\n", + "\n", + " self.layers = torch.nn.Sequential(\n", + " \n", + " # 第一个隐藏层\n", + " torch.nn.Linear(num_inputs, 30),\n", + " torch.nn.ReLU(),\n", + "\n", + " # 第二个隐藏层\n", + " torch.nn.Linear(30, 20),\n", + " torch.nn.ReLU(),\n", + "\n", + " # 输出层\n", + " torch.nn.Linear(20, num_outputs),\n", + " )\n", + "\n", + " def forward(self, x):\n", + " logits = self.layers(x)\n", + " return logits" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of trainable model parameters: 752\n" + ] + } + ], + "source": [ + "model = NeuralNetwork(2, 2)\n", + "\n", + "num_params = sum(p.numel() for p in model.parameters() if p.requires_grad)\n", + "print(\"Total number of trainable model parameters:\", num_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 练习 A.4" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "qGgnamiyLJxp" + }, + "outputs": [], + "source": [ + "import torch\n", + "# 创建随机向量\n", + "a = torch.rand(100, 200)\n", + "b = torch.rand(200, 300)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CvGvIeVkLzXE", + "outputId": "44d027be-0787-4348-9c06-4e559d94d0e1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "63.8 µs ± 8.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" + ] + } + ], + "source": [ + "# 使用 @ 符号进行矩阵相乘,并计算执行时间\n", + "# %timeit 是 IPython 提供的魔术命令,用于多次执行代码以获取平均执行时间\n", + "# 它会自动选择执行次数以确保结果的准确性\n", + "%timeit a @ b" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "OmRtZLa9L2ZG" + }, + "outputs": [], + "source": [ + "# 将 a 和 b 移动到 CUDA 设备上以利用 GPU 加速计算\n", + "a, b = a.to(\"cuda\"), b.to(\"cuda\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "duLEhXDPL6k0", + "outputId": "3486471d-fd62-446f-9855-2d01f41fd101" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13.8 µs ± 425 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" + ] + } + ], + "source": [ + "%timeit a @ b" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "V100", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}