{"id":1793,"date":"2025-02-16T23:04:31","date_gmt":"2025-02-16T15:04:31","guid":{"rendered":"https:\/\/www.forillusion.com\/?p=1793"},"modified":"2025-02-16T23:04:32","modified_gmt":"2025-02-16T15:04:32","slug":"4-1-model-construction","status":"publish","type":"post","link":"https:\/\/www.forillusion.com\/index.php\/4-1-model-construction\/","title":{"rendered":"4.1 \u6a21\u578b\u6784\u9020"},"content":{"rendered":"\n<p><div class=\"has-toc have-toc\"><\/div><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7ee7\u627fModule-\u7c7b\u6765\u6784\u9020\u6a21\u578b\">\u7ee7\u627fModule\u200b\u7c7b\u6765\u6784\u9020\u6a21\u578b<\/h2>\n\n\n\n<p id=\"20250216224520-kqu90lc\">\u200bModule\u200b\u7c7b\u662fnn\u200b\u6a21\u5757\u91cc\u63d0\u4f9b\u7684\u4e00\u4e2a\u6a21\u578b\u6784\u9020\u7c7b\uff0c\u662f\u6240\u6709\u795e\u7ecf\u7f51\u7edc\u6a21\u5757\u7684\u57fa\u7c7b\uff0c\u53ef\u4ee5\u7ee7\u627f\u5b83\u6765\u5b9a\u4e49\u60f3\u8981\u7684\u6a21\u578b\u3002\u4e0b\u9762\u7ee7\u627fModule\u200b\u7c7b\u6784\u9020\u4e00\u4e2a\u591a\u5c42\u611f\u77e5\u673a\u3002\u8fd9\u91cc\u5b9a\u4e49\u7684MLP\u200b\u7c7b\u91cd\u8f7d\u4e86Module\u200b\u7c7b\u7684__init__\u200b\u51fd\u6570\u548cforward\u200b\u51fd\u6570\u3002\u5b83\u4eec\u5206\u522b\u7528\u4e8e\u521b\u5efa\u6a21\u578b\u53c2\u6570\u548c\u5b9a\u4e49\u524d\u5411\u8ba1\u7b97\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import torch\nfrom torch import nn\n\nclass MLP(nn.Module):\n    # \u58f0\u660e\u5e26\u6709\u6a21\u578b\u53c2\u6570\u7684\u5c42\uff0c\u8fd9\u91cc\u58f0\u660e\u4e86\u4e24\u4e2a\u5168\u8fde\u63a5\u5c42\n    def __init__(self, **kwargs):\n        # \u8c03\u7528MLP\u7236\u7c7bModule\u7684\u6784\u9020\u51fd\u6570\u6765\u8fdb\u884c\u5fc5\u8981\u7684\u521d\u59cb\u5316\u3002\u8fd9\u6837\u5728\u6784\u9020\u5b9e\u4f8b\u65f6\u8fd8\u53ef\u4ee5\u6307\u5b9a\u5176\u4ed6\u51fd\u6570\n        super(MLP, self).__init__(**kwargs)\n        self.hidden = nn.Linear(784, 256) # \u9690\u85cf\u5c42\n        self.act = nn.ReLU()\n        self.output = nn.Linear(256, 10)  # \u8f93\u51fa\u5c42\n   \n\n    # \u5b9a\u4e49\u6a21\u578b\u7684\u524d\u5411\u8ba1\u7b97\uff0c\u5373\u5982\u4f55\u6839\u636e\u8f93\u5165x\u8ba1\u7b97\u8fd4\u56de\u6240\u9700\u8981\u7684\u6a21\u578b\u8f93\u51fa\n    def forward(self, x):\n        a = self.act(self.hidden(x))\n        return self.output(a)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-nmhnqzb\">\u4ee5\u4e0a\u7684MLP\u200b\u7c7b\u4e2d\u65e0\u987b\u5b9a\u4e49\u53cd\u5411\u4f20\u64ad\u51fd\u6570\u3002\u7cfb\u7edf\u5c06\u901a\u8fc7\u81ea\u52a8\u6c42\u68af\u5ea6\u800c\u81ea\u52a8\u751f\u6210\u53cd\u5411\u4f20\u64ad\u6240\u9700\u7684backward\u200b\u51fd\u6570\u3002<\/p>\n\n\n\n<p id=\"20250216224520-6f6n8bj\">\u53ef\u4ee5\u5b9e\u4f8b\u5316MLP\u200b\u7c7b\u5f97\u5230\u6a21\u578b\u53d8\u91cfnet\u200b\u3002\u4e0b\u9762\u7684\u4ee3\u7801\u521d\u59cb\u5316net\u200b\u5e76\u4f20\u5165\u8f93\u5165\u6570\u636eX\u200b\u505a\u4e00\u6b21\u524d\u5411\u8ba1\u7b97\u3002\u5176\u4e2d\uff0cnet(X)\u200b\u4f1a\u8c03\u7528MLP\u200b\u7ee7\u627f\u81eaModule\u200b\u7c7b\u7684__call__\u200b\u51fd\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u5c06\u8c03\u7528MLP\u200b\u7c7b\u5b9a\u4e49\u7684forward\u200b\u51fd\u6570\u6765\u5b8c\u6210\u524d\u5411\u8ba1\u7b97\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>X = torch.rand(2, 784)\nnet = MLP()\nprint(net)\nnet(X)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-n71yq4z\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MLP(\n  (hidden): Linear(in_features=784, out_features=256, bias=True)\n  (act): ReLU()\n  (output): Linear(in_features=256, out_features=10, bias=True)\n)\ntensor(&#91;&#91;-0.1798, -0.2253,  0.0206, -0.1067, -0.0889,  0.1818, -0.1474,  0.1845,\n         -0.1870,  0.1970],\n        &#91;-0.1843, -0.1562, -0.0090,  0.0351, -0.1538,  0.0992, -0.0883,  0.0911,\n         -0.2293,  0.2360]], grad_fn=&lt;ThAddmmBackward&gt;)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Module-\u7684\u5b50\u7c7b\">Module\u200b\u7684\u5b50\u7c7b<\/h2>\n\n\n\n<p id=\"20250216224520-6usdkgs\">\u200bModule\u200b\u7c7b\u662f\u4e00\u4e2a\u901a\u7528\u7684\u90e8\u4ef6\uff0cPyTorch\u8fd8\u5b9e\u73b0\u4e86\u7ee7\u627f\u81eaModule\u200b\u7684\u53ef\u4ee5\u65b9\u4fbf\u6784\u5efa\u6a21\u578b\u7684\u7c7b: \u5982Sequential\u200b\u3001ModuleList\u200b\u548cModuleDict\u200b\u7b49\u7b49\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Sequential-\u7c7b\">Sequential\u200b\u7c7b<\/h3>\n\n\n\n<p id=\"20250216224520-z5cwyal\">\u5f53\u6a21\u578b\u7684\u524d\u5411\u8ba1\u7b97\u4e3a\u7b80\u5355\u4e32\u8054\u5404\u4e2a\u5c42\u7684\u8ba1\u7b97\u65f6\uff0cSequential\u200b\u7c7b\u53ef\u4ee5\u901a\u8fc7\u66f4\u52a0\u7b80\u5355\u7684\u65b9\u5f0f\u5b9a\u4e49\u6a21\u578b\u3002Sequential\u200b\u7c7b\u53ef\u4ee5\u63a5\u6536\u4e00\u4e2a\u5b50\u6a21\u5757\u7684\u6709\u5e8f\u5b57\u5178\uff08OrderedDict\uff09\u6216\u8005\u4e00\u7cfb\u5217\u5b50\u6a21\u5757\u4f5c\u4e3a\u53c2\u6570\u6765\u9010\u4e00\u6dfb\u52a0Module\u200b\u7684\u5b9e\u4f8b\uff0c\u800c\u6a21\u578b\u7684\u524d\u5411\u8ba1\u7b97\u5c31\u662f\u5c06\u8fd9\u4e9b\u5b9e\u4f8b\u6309\u6dfb\u52a0\u7684\u987a\u5e8f\u9010\u4e00\u8ba1\u7b97\u3002<\/p>\n\n\n\n<p id=\"20250216224520-a137zwg\">\u4e0b\u9762\u5b9e\u73b0\u4e00\u4e2a\u4e0eSequential\u200b\u7c7b\u6709\u76f8\u540c\u529f\u80fd\u7684MySequential\u200b\u7c7b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class MySequential(nn.Module):\n    from collections import OrderedDict\n    def __init__(self, *args):\n        super(MySequential, self).__init__()\n        if len(args) == 1 and isinstance(args&#91;0], OrderedDict): # \u5982\u679c\u4f20\u5165\u7684\u662f\u4e00\u4e2aOrderedDict\n            for key, module in args&#91;0].items():\n                self.add_module(key, module)  # add_module\u65b9\u6cd5\u4f1a\u5c06module\u6dfb\u52a0\u8fdbself._modules(\u4e00\u4e2aOrderedDict)\n        else:  # \u4f20\u5165\u7684\u662f\u4e00\u4e9bModule\n            for idx, module in enumerate(args):\n                self.add_module(str(idx), module)\n    def forward(self, input):\n        # self._modules\u8fd4\u56de\u4e00\u4e2a OrderedDict\uff0c\u4fdd\u8bc1\u4f1a\u6309\u7167\u6210\u5458\u6dfb\u52a0\u65f6\u7684\u987a\u5e8f\u904d\u5386\u6210\u5458\n        for module in self._modules.values():\n            input = module(input)\n        return input\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-gx5n976\">\u7528MySequential\u200b\u7c7b\u6765\u5b9e\u73b0\u524d\u9762\u63cf\u8ff0\u7684MLP\u200b\u7c7b\uff0c\u5e76\u4f7f\u7528\u968f\u673a\u521d\u59cb\u5316\u7684\u6a21\u578b\u505a\u4e00\u6b21\u524d\u5411\u8ba1\u7b97\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net = MySequential(\n        nn.Linear(784, 256),\n        nn.ReLU(),\n        nn.Linear(256, 10), \n        )\nprint(net)\nnet(X)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-kn3tuj7\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySequential(\n  (0): Linear(in_features=784, out_features=256, bias=True)\n  (1): ReLU()\n  (2): Linear(in_features=256, out_features=10, bias=True)\n)\ntensor(&#91;&#91;-0.0100, -0.2516,  0.0392, -0.1684, -0.0937,  0.2191, -0.1448,  0.0930,\n          0.1228, -0.2540],\n        &#91;-0.1086, -0.1858,  0.0203, -0.2051, -0.1404,  0.2738, -0.0607,  0.0622,\n          0.0817, -0.2574]], grad_fn=&lt;ThAddmmBackward&gt;)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ModuleList-\u7c7b\">ModuleList\u200b\u7c7b<\/h3>\n\n\n\n<p id=\"20250216224520-4qo2u2p\">\u200bModuleList\u200b\u63a5\u6536\u4e00\u4e2a\u5b50\u6a21\u5757\u7684\u5217\u8868\u4f5c\u4e3a\u8f93\u5165\uff0c\u7136\u540e\u4e5f\u53ef\u4ee5\u7c7b\u4f3cList\u90a3\u6837\u8fdb\u884cappend\u548cextend\u64cd\u4f5c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net = nn.ModuleList(&#91;nn.Linear(784, 256), nn.ReLU()])\nnet.append(nn.Linear(256, 10)) # # \u7c7b\u4f3cList\u7684append\u64cd\u4f5c\nprint(net&#91;-1])  # \u7c7b\u4f3cList\u7684\u7d22\u5f15\u8bbf\u95ee\nprint(net)\n# net(torch.zeros(1, 784)) # \u4f1a\u62a5NotImplementedError\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-e50etun\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Linear(in_features=256, out_features=10, bias=True)\nModuleList(\n  (0): Linear(in_features=784, out_features=256, bias=True)\n  (1): ReLU()\n  (2): Linear(in_features=256, out_features=10, bias=True)\n)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-fu79de2\">\u65e2\u7136Sequential\u200b\u548cModuleList\u200b\u90fd\u53ef\u4ee5\u8fdb\u884c\u5217\u8868\u5316\u6784\u9020\u7f51\u7edc\uff0c\u4e8c\u8005\u533a\u522b\uff1aModuleList\u200b\u4ec5\u4ec5\u662f\u4e00\u4e2a\u50a8\u5b58\u5404\u79cd\u6a21\u5757\u7684\u5217\u8868\uff0c\u8fd9\u4e9b\u6a21\u5757\u4e4b\u95f4\u6ca1\u6709\u8054\u7cfb\u4e5f\u6ca1\u6709\u987a\u5e8f\uff08\u6240\u4ee5\u4e0d\u7528\u4fdd\u8bc1\u76f8\u90bb\u5c42\u7684\u8f93\u5165\u8f93\u51fa\u7ef4\u5ea6\u5339\u914d\uff09\uff0c\u800c\u4e14\u6ca1\u6709\u5b9e\u73b0forward\u200b\u529f\u80fd\u9700\u8981\u81ea\u5df1\u5b9e\u73b0\uff0c\u6240\u4ee5\u4e0a\u9762\u6267\u884cnet(torch.zeros(1, 784))\u200b\u4f1a\u62a5NotImplementedError\u200b\uff1b\u800cSequential\u200b\u5185\u7684\u6a21\u5757\u9700\u8981\u6309\u7167\u987a\u5e8f\u6392\u5217\uff0c\u8981\u4fdd\u8bc1\u76f8\u90bb\u5c42\u7684\u8f93\u5165\u8f93\u51fa\u5927\u5c0f\u76f8\u5339\u914d\uff0c\u5185\u90e8forward\u200b\u529f\u80fd\u5df2\u7ecf\u5b9e\u73b0\u3002<\/p>\n\n\n\n<p id=\"20250216224520-mp21avn\">\u53e6\u5916\uff0cModuleList\u200b\u4e0d\u540c\u4e8e\u4e00\u822c\u7684Python\u7684list\u200b\uff0c\u52a0\u5165\u5230ModuleList\u200b\u91cc\u9762\u7684\u6240\u6709\u6a21\u5757\u7684\u53c2\u6570\u4f1a\u88ab\u81ea\u52a8\u6dfb\u52a0\u5230\u6574\u4e2a\u7f51\u7edc\uff08\u7236\u6a21\u5757\uff09\u4e2d\uff0c\u6ce8\u518c\u540e\uff0c\u8fd9\u4e9b\u5b50\u6a21\u5757\u7684\u53c2\u6570\uff08\u6743\u91cd\u548c\u504f\u7f6e\uff09\u4f1a\u88ab\u7236\u6a21\u5757\u7684 .parameters()\u200b \u65b9\u6cd5\u6536\u96c6\uff0c\u4ece\u800c\u88ab\u4f18\u5316\u5668\u8bc6\u522b\u5e76\u66f4\u65b0\u3002\u4e0b\u9762\u770b\u4e00\u4e2a\u4f8b\u5b50\u5bf9\u6bd4\u4e00\u4e0b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Module_ModuleList(nn.Module):\n    def __init__(self):\n        super(Module_ModuleList, self).__init__()\n        self.linears = nn.ModuleList(&#91;nn.Linear(10, 10)])\n  \nclass Module_List(nn.Module):\n    def __init__(self):\n        super(Module_List, self).__init__()\n        self.linears = &#91;nn.Linear(10, 10)]\n\nnet1 = Module_ModuleList()\nnet2 = Module_List()\n\nprint(\"net1:\")\nfor p in net1.parameters():\n    print(p.size())\n\nprint(\"net2:\")\nfor p in net2.parameters():\n    print(p)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-0q4v1yi\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net1:\ntorch.Size(&#91;10, 10])\ntorch.Size(&#91;10])\nnet2:  # \u8f93\u51fa\uff1a\u7a7a\u5217\u8868\uff08\u53c2\u6570\u672a\u88ab\u6ce8\u518c\uff09\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ModuleDict-\u7c7b\">ModuleDict\u200b\u7c7b<\/h3>\n\n\n\n<p id=\"20250216224520-lgp75ii\">\u200bModuleDict\u200b\u63a5\u6536\u4e00\u4e2a\u5b50\u6a21\u5757\u7684\u5b57\u5178\u4f5c\u4e3a\u8f93\u5165, \u7136\u540e\u4e5f\u53ef\u4ee5\u7c7b\u4f3c\u5b57\u5178\u90a3\u6837\u8fdb\u884c\u6dfb\u52a0\u8bbf\u95ee\u64cd\u4f5c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net = nn.ModuleDict({\n    'linear': nn.Linear(784, 256),\n    'act': nn.ReLU(),\n})\nnet&#91;'output'] = nn.Linear(256, 10) # \u6dfb\u52a0\nprint(net&#91;'linear']) # \u8bbf\u95ee\nprint(net.output)\nprint(net)\n# net(torch.zeros(1, 784)) # \u4f1a\u62a5NotImplementedError\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-d2i6358\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Linear(in_features=784, out_features=256, bias=True)\nLinear(in_features=256, out_features=10, bias=True)\nModuleDict(\n  (act): ReLU()\n  (linear): Linear(in_features=784, out_features=256, bias=True)\n  (output): Linear(in_features=256, out_features=10, bias=True)\n)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-mo94k9b\">\u548cModuleList\u200b\u4e00\u6837\uff0cModuleDict\u200b\u5b9e\u4f8b\u4ec5\u4ec5\u662f\u5b58\u653e\u4e86\u4e00\u4e9b\u6a21\u5757\u7684\u5b57\u5178\uff0c\u5e76\u6ca1\u6709\u5b9a\u4e49forward\u200b\u51fd\u6570\u9700\u8981\u81ea\u5df1\u5b9a\u4e49\u3002\u540c\u6837\uff0cModuleDict\u200b\u4e5f\u4e0ePython\u7684Dict\u200b\u6709\u6240\u4e0d\u540c\uff0cModuleDict\u200b\u91cc\u7684\u6240\u6709\u6a21\u5757\u7684\u53c2\u6570\u4f1a\u88ab\u81ea\u52a8\u6dfb\u52a0\u5230\u6574\u4e2a\u7f51\u7edc\u4e2d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"4-1-3-\u6784\u9020\u590d\u6742\u7684\u6a21\u578b\">4.1.3 \u6784\u9020\u590d\u6742\u7684\u6a21\u578b<\/h2>\n\n\n\n<p id=\"20250216224520-xlwr0u0\">\u867d\u7136\u4e0a\u9762\u4ecb\u7ecd\u7684\u8fd9\u4e9b\u7c7b\u53ef\u4ee5\u4f7f\u6a21\u578b\u6784\u9020\u66f4\u52a0\u7b80\u5355\uff0c\u4e14\u4e0d\u9700\u8981\u5b9a\u4e49forward\u200b\u51fd\u6570\uff0c\u4f46\u76f4\u63a5\u7ee7\u627fModule\u200b\u7c7b\u53ef\u4ee5\u6781\u5927\u5730\u62d3\u5c55\u6a21\u578b\u6784\u9020\u7684\u7075\u6d3b\u6027\u3002\u4e0b\u9762\u6784\u9020\u4e00\u4e2a\u7a0d\u5fae\u590d\u6742\u70b9\u7684\u7f51\u7edcFancyMLP\u200b\u3002\u5728\u8fd9\u4e2a\u7f51\u7edc\u4e2d\uff0c\u901a\u8fc7get_constant\u200b\u51fd\u6570\u521b\u5efa\u8bad\u7ec3\u4e2d\u4e0d\u88ab\u8fed\u4ee3\u7684\u53c2\u6570\uff0c\u5373\u5e38\u6570\u53c2\u6570\u3002\u5728\u524d\u5411\u8ba1\u7b97\u4e2d\uff0c\u9664\u4e86\u4f7f\u7528\u521b\u5efa\u7684\u5e38\u6570\u53c2\u6570\u5916\uff0c\u8fd8\u4f7f\u7528Tensor\u200b\u7684\u51fd\u6570\u548cPython\u7684\u63a7\u5236\u6d41\uff0c\u5e76\u591a\u6b21\u8c03\u7528\u76f8\u540c\u7684\u5c42\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class FancyMLP(nn.Module):\n    def __init__(self, **kwargs):\n        super(FancyMLP, self).__init__(**kwargs)\n  \n        self.rand_weight = torch.rand((20, 20), requires_grad=False) # \u4e0d\u53ef\u8bad\u7ec3\u53c2\u6570\uff08\u5e38\u6570\u53c2\u6570\uff09\n        self.linear = nn.Linear(20, 20)\n\n    def forward(self, x):\n        x = self.linear(x)\n        # \u4f7f\u7528\u521b\u5efa\u7684\u5e38\u6570\u53c2\u6570\uff0c\u4ee5\u53cann.functional\u4e2d\u7684relu\u51fd\u6570\u548cmm\u51fd\u6570\n        x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1)\n  \n        # \u590d\u7528\u5168\u8fde\u63a5\u5c42\u3002\u7b49\u4ef7\u4e8e\u4e24\u4e2a\u5168\u8fde\u63a5\u5c42\u5171\u4eab\u53c2\u6570\n        x = self.linear(x)\n        # \u63a7\u5236\u6d41\uff0c\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u8c03\u7528item\u51fd\u6570\u6765\u8fd4\u56de\u6807\u91cf\u8fdb\u884c\u6bd4\u8f83\n        while x.norm().item() &gt; 1:\n            x \/= 2\n        if x.norm().item() &lt; 0.8:\n            x *= 10\n        return x.sum()\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-0c0p8zc\">\u5728\u8fd9\u4e2aFancyMLP\u200b\u6a21\u578b\u4e2d\uff0c\u4f7f\u7528\u4e86\u5e38\u6570\u6743\u91cdrand_weight\u200b\uff08\u6ce8\u610f\u5b83\u4e0d\u662f\u53ef\u8bad\u7ec3\u6a21\u578b\u53c2\u6570\uff09\u3001\u505a\u4e86\u77e9\u9635\u4e58\u6cd5\u64cd\u4f5c\uff08torch.mm\u200b\uff09\u5e76\u91cd\u590d\u4f7f\u7528\u4e86\u76f8\u540c\u7684Linear\u200b\u5c42\u3002\u4e0b\u9762\u6765\u6d4b\u8bd5\u8be5\u6a21\u578b\u7684\u524d\u5411\u8ba1\u7b97\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>X = torch.rand(2, 20)\nnet = FancyMLP()\nprint(net)\nnet(X)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-ns8z04d\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FancyMLP(\n  (linear): Linear(in_features=20, out_features=20, bias=True)\n)\ntensor(0.8432, grad_fn=&lt;SumBackward0&gt;)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-yncg7vs\">\u56e0\u4e3aFancyMLP\u200b\u548cSequential\u200b\u7c7b\u90fd\u662fModule\u200b\u7c7b\u7684\u5b50\u7c7b\uff0c\u6240\u4ee5\u53ef\u4ee5\u5d4c\u5957\u8c03\u7528\u5b83\u4eec\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class NestMLP(nn.Module):\n    def __init__(self, **kwargs):\n        super(NestMLP, self).__init__(**kwargs)\n        self.net = nn.Sequential(nn.Linear(40, 30), nn.ReLU()) \n\n    def forward(self, x):\n        return self.net(x)\n\nnet = nn.Sequential(NestMLP(), nn.Linear(30, 20), FancyMLP())\n\nX = torch.rand(2, 40)\nprint(net)\nnet(X)\n<\/code><\/pre>\n\n\n\n<p id=\"20250216224520-eo7o6jt\">\u8f93\u51fa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sequential(\n  (0): NestMLP(\n    (net): Sequential(\n      (0): Linear(in_features=40, out_features=30, bias=True)\n      (1): ReLU()\n    )\n  )\n  (1): Linear(in_features=30, out_features=20, bias=True)\n  (2): FancyMLP(\n    (linear): Linear(in_features=20, out_features=20, bias=True)\n  )\n)\ntensor(14.4908, grad_fn=&lt;SumBackward0&gt;)\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7ee7\u627fModule\u200b\u7c7b\u6765\u6784\u9020\u6a21\u578b \u200bModule\u200b\u7c7b\u662fnn\u200b\u6a21\u5757\u91cc\u63d0\u4f9b\u7684\u4e00\u4e2a\u6a21\u578b\u6784\u9020\u7c7b\uff0c\u662f\u6240\u6709\u795e\u7ecf\u7f51\u7edc\u6a21\u5757\u7684\u57fa\u7c7b\uff0c\u53ef\u4ee5\u7ee7\u627f\u5b83\u6765\u5b9a\u4e49\u60f3 &#8230;<\/p>","protected":false},"author":1,"featured_media":1794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,3],"tags":[45,44,12,22],"class_list":["post-1793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-46","category-3","tag-45","tag-44","tag-12","tag-22"],"_links":{"self":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/comments?post=1793"}],"version-history":[{"count":1,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1793\/revisions"}],"predecessor-version":[{"id":1795,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/posts\/1793\/revisions\/1795"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media\/1794"}],"wp:attachment":[{"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/media?parent=1793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/categories?post=1793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forillusion.com\/index.php\/wp-json\/wp\/v2\/tags?post=1793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}