Files

1 line
28 KiB
JavaScript

"use strict";(globalThis.webpackChunkblog=globalThis.webpackChunkblog||[]).push([[9369],{10618:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/3.6.2-8bc87fe2341be69165add66702b37147.png"},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>o});var t=r(96540);const s={},a=t.createContext(s);function i(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(a.Provider,{value:n},e.children)}},35281:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/3.6.1-c1ee95e9e5c6e05469f47cab67d0c8ac.png"},77049:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"\u4e2a\u4eba\u77e5\u8bc6\u5e93/AI/PyTorch/\u7b2c\u4e09\u7ae0/3.9 \u4f18\u5316\u5668","title":"3.9 \u4f18\u5316\u5668.md","description":"|\u4f5c\u8005|\u4fee\u8ba2\u65f6\u95f4|","source":"@site/docs/\u4e2a\u4eba\u77e5\u8bc6\u5e93/10.AI/01.PyTorch/03.\u7b2c\u4e09\u7ae0/3.9 \u4f18\u5316\u5668.md","sourceDirName":"\u4e2a\u4eba\u77e5\u8bc6\u5e93/10.AI/01.PyTorch/03.\u7b2c\u4e09\u7ae0","slug":"/\u4e2a\u4eba\u77e5\u8bc6\u5e93/AI/PyTorch/\u7b2c\u4e09\u7ae0/3.9 \u4f18\u5316\u5668","permalink":"/docs/\u4e2a\u4eba\u77e5\u8bc6\u5e93/AI/PyTorch/\u7b2c\u4e09\u7ae0/3.9 \u4f18\u5316\u5668","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/\u4e2a\u4eba\u77e5\u8bc6\u5e93/10.AI/01.PyTorch/03.\u7b2c\u4e09\u7ae0/3.9 \u4f18\u5316\u5668.md","tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"3.8 \u53ef\u89c6\u5316.md","permalink":"/docs/\u4e2a\u4eba\u77e5\u8bc6\u5e93/AI/PyTorch/\u7b2c\u4e09\u7ae0/3.8 \u53ef\u89c6\u5316"},"next":{"title":"\u7b2c\u56db\u7ae0","permalink":"/docs/\u4e2a\u4eba\u77e5\u8bc6\u5e93/AI/PyTorch/\u7b2c\u56db\u7ae0/"}}');var s=r(74848),a=r(28453);const i={},o="3.9 \u4f18\u5316\u5668.md",d={},l=[{value:"3.9.1 PyTorch\u63d0\u4f9b\u7684\u4f18\u5316\u5668",id:"391-pytorch\u63d0\u4f9b\u7684\u4f18\u5316\u5668",level:2},{value:"3.9.2 \u5b9e\u9645\u64cd\u4f5c",id:"392-\u5b9e\u9645\u64cd\u4f5c",level:2},{value:"3.9.3 \u8f93\u51fa\u7ed3\u679c",id:"393-\u8f93\u51fa\u7ed3\u679c",level:2},{value:"3.9.4 \u5b9e\u9a8c",id:"394-\u5b9e\u9a8c",level:2}];function p(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"39-\u4f18\u5316\u5668md",children:"3.9 \u4f18\u5316\u5668.md"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{style:{textAlign:"left"},children:"\u4f5c\u8005"}),(0,s.jsx)(n.th,{style:{textAlign:"left"},children:"\u4fee\u8ba2\u65f6\u95f4"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{style:{textAlign:"left"},children:(0,s.jsx)(n.img,{src:"https://img.shields.io/badge/wjlin0-%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93-green",alt:"wjlin0"})}),(0,s.jsx)(n.td,{style:{textAlign:"left"},children:"2026-06-07 20:53:14"})]})})]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{style:{textAlign:"left"},children:"\u4f5c\u8005"}),(0,s.jsx)(n.th,{style:{textAlign:"left"},children:"\u4fee\u8ba2\u65f6\u95f4"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{style:{textAlign:"left"},children:(0,s.jsx)(n.img,{src:"https://img.shields.io/badge/wjlin0-%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93-green",alt:"wjlin0"})}),(0,s.jsx)(n.td,{style:{textAlign:"left"},children:"2025-10-31 15:44:29"})]})})]}),"\n",(0,s.jsx)(n.h1,{id:"39-pytorch\u4f18\u5316\u5668",children:"3.9 PyTorch\u4f18\u5316\u5668"}),"\n",(0,s.jsx)(n.p,{children:"\u6df1\u5ea6\u5b66\u4e60\u7684\u76ee\u6807\u662f\u901a\u8fc7\u4e0d\u65ad\u6539\u53d8\u7f51\u7edc\u53c2\u6570\uff0c\u4f7f\u5f97\u53c2\u6570\u80fd\u591f\u5bf9\u8f93\u5165\u505a\u5404\u79cd\u975e\u7ebf\u6027\u53d8\u6362\u62df\u5408\u8f93\u51fa\uff0c\u672c\u8d28\u4e0a\u5c31\u662f\u4e00\u4e2a\u51fd\u6570\u53bb\u5bfb\u627e\u6700\u4f18\u89e3\uff0c\u53ea\u4e0d\u8fc7\u8fd9\u4e2a\u6700\u4f18\u89e3\u662f\u4e00\u4e2a\u77e9\u9635\uff0c\u800c\u5982\u4f55\u5feb\u901f\u6c42\u5f97\u8fd9\u4e2a\u6700\u4f18\u89e3\u662f\u6df1\u5ea6\u5b66\u4e60\u7814\u7a76\u7684\u4e00\u4e2a\u91cd\u70b9\uff0c\u4ee5\u7ecf\u5178\u7684resnet-50\u4e3a\u4f8b\uff0c\u5b83\u5927\u7ea6\u67092000\u4e07\u4e2a\u7cfb\u6570\u9700\u8981\u8fdb\u884c\u8ba1\u7b97\uff0c\u90a3\u4e48\u6211\u4eec\u5982\u4f55\u8ba1\u7b97\u51fa\u8fd9\u4e48\u591a\u7cfb\u6570\uff0c\u6709\u4ee5\u4e0b\u4e24\u79cd\u65b9\u6cd5\uff1a"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"\u7b2c\u4e00\u79cd\u662f\u76f4\u63a5\u66b4\u529b\u7a77\u4e3e\u4e00\u904d\u53c2\u6570\uff0c\u8fd9\u79cd\u65b9\u6cd5\u4ece\u7406\u8bba\u4e0a\u884c\u5f97\u901a\uff0c\u4f46\u662f\u5b9e\u65bd\u4e0a\u53ef\u80fd\u6027\u57fa\u672c\u4e3a0\uff0c\u56e0\u4e3a\u53c2\u6570\u91cf\u8fc7\u4e8e\u5e9e\u5927\u3002"}),"\n",(0,s.jsx)(n.li,{children:"\u4e3a\u4e86\u4f7f\u6c42\u89e3\u53c2\u6570\u8fc7\u7a0b\u66f4\u5feb\uff0c\u4eba\u4eec\u63d0\u51fa\u4e86\u7b2c\u4e8c\u79cd\u529e\u6cd5\uff0c\u5373BP+\u4f18\u5316\u5668\u903c\u8fd1\u6c42\u89e3\u3002"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"\u56e0\u6b64\uff0c\u4f18\u5316\u5668\u662f\u6839\u636e\u7f51\u7edc\u53cd\u5411\u4f20\u64ad\u7684\u68af\u5ea6\u4fe1\u606f\u6765\u66f4\u65b0\u7f51\u7edc\u7684\u53c2\u6570\uff0c\u4ee5\u8d77\u5230\u964d\u4f4eloss\u51fd\u6570\u8ba1\u7b97\u503c\uff0c\u4f7f\u5f97\u6a21\u578b\u8f93\u51fa\u66f4\u52a0\u63a5\u8fd1\u771f\u5b9e\u6807\u7b7e\u3002"}),"\n",(0,s.jsx)(n.p,{children:"\u7ecf\u8fc7\u672c\u8282\u7684\u5b66\u4e60\uff0c\u4f60\u5c06\u6536\u83b7\uff1a"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"\u4e86\u89e3PyTorch\u7684\u4f18\u5316\u5668"}),"\n",(0,s.jsx)(n.li,{children:"\u5b66\u4f1a\u4f7f\u7528PyTorch\u63d0\u4f9b\u7684\u4f18\u5316\u5668\u8fdb\u884c\u4f18\u5316"}),"\n",(0,s.jsx)(n.li,{children:"\u4f18\u5316\u5668\u7684\u5c5e\u6027\u548c\u6784\u9020"}),"\n",(0,s.jsx)(n.li,{children:"\u4f18\u5316\u5668\u7684\u5bf9\u6bd4"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"391-pytorch\u63d0\u4f9b\u7684\u4f18\u5316\u5668",children:"3.9.1 PyTorch\u63d0\u4f9b\u7684\u4f18\u5316\u5668"}),"\n",(0,s.jsxs)(n.p,{children:["PyTorch\u5f88\u4eba\u6027\u5316\u7684\u7ed9\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4f18\u5316\u5668\u7684\u5e93",(0,s.jsx)(n.code,{children:"torch.optim"}),"\uff0c\u5728\u8fd9\u91cc\u9762\u63d0\u4f9b\u4e86\u591a\u79cd\u4f18\u5316\u5668\u3002"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"torch.optim.SGD"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.ASGD"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.Adadelta"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.Adagrad"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.Adam"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.AdamW"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.Adamax"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.RAdam"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.NAdam"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.SparseAdam"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.LBFGS"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.RMSprop"}),"\n",(0,s.jsx)(n.li,{children:"torch.optim.Rprop"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["\u800c\u4ee5\u4e0a\u8fd9\u4e9b\u4f18\u5316\u7b97\u6cd5\u5747\u7ee7\u627f\u4e8e",(0,s.jsx)(n.code,{children:"Optimizer"}),"\uff0c\u4e0b\u9762\u6211\u4eec\u5148\u6765\u770b\u4e0b\u6240\u6709\u4f18\u5316\u5668\u7684\u57fa\u7c7b",(0,s.jsx)(n.code,{children:"Optimizer"}),"\u3002\u5b9a\u4e49\u5982\u4e0b\uff1a"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-Python",children:"class Optimizer(object):\n def __init__(self, params, defaults): \n self.defaults = defaults\n self.state = defaultdict(dict)\n self.param_groups = []\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:[(0,s.jsx)(n.code,{children:"Optimizer"}),"\u6709\u4e09\u4e2a\u5c5e\u6027\uff1a"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"defaults"}),"\uff1a\u5b58\u50a8\u7684\u662f\u4f18\u5316\u5668\u7684\u8d85\u53c2\u6570\uff0c\u4f8b\u5b50\u5982\u4e0b\uff1a"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"state"}),"\uff1a\u53c2\u6570\u7684\u7f13\u5b58\uff0c\u4f8b\u5b50\u5982\u4e0b\uff1a"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"defaultdict(<class 'dict'>, {tensor([[ 0.3864, -0.0131],\n [-0.1911, -0.4511]], requires_grad=True): {'momentum_buffer': tensor([[0.0052, 0.0052],\n [0.0052, 0.0052]])}})\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"param_groups"}),"\uff1a\u7ba1\u7406\u7684\u53c2\u6570\u7ec4\uff0c\u662f\u4e00\u4e2alist\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5143\u7d20\u662f\u4e00\u4e2a\u5b57\u5178\uff0c\u987a\u5e8f\u662fparams\uff0clr\uff0cmomentum\uff0cdampening\uff0cweight_decay\uff0cnesterov\uff0c\u4f8b\u5b50\u5982\u4e0b\uff1a"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"[{'params': [tensor([[-0.1022, -1.6890],[-1.5116, -1.7846]], requires_grad=True)], 'lr': 1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}]\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:[(0,s.jsx)(n.code,{children:"Optimizer"}),"\u8fd8\u6709\u4ee5\u4e0b\u7684\u65b9\u6cd5\uff1a"]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"zero_grad()"}),"\uff1a\u6e05\u7a7a\u6240\u7ba1\u7406\u53c2\u6570\u7684\u68af\u5ea6\uff0cPyTorch\u7684\u7279\u6027\u662f\u5f20\u91cf\u7684\u68af\u5ea6\u4e0d\u81ea\u52a8\u6e05\u96f6\uff0c\u56e0\u6b64\u6bcf\u6b21\u53cd\u5411\u4f20\u64ad\u540e\u90fd\u9700\u8981\u6e05\u7a7a\u68af\u5ea6\u3002"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def zero_grad(self, set_to_none: bool = False):\n for group in self.param_groups:\n for p in group['params']:\n if p.grad is not None: #\u68af\u5ea6\u4e0d\u4e3a\u7a7a\n if set_to_none: \n p.grad = None\n else:\n if p.grad.grad_fn is not None:\n p.grad.detach_()\n else:\n p.grad.requires_grad_(False)\n p.grad.zero_()# \u68af\u5ea6\u8bbe\u7f6e\u4e3a0\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"step()"}),"\uff1a\u6267\u884c\u4e00\u6b65\u68af\u5ea6\u66f4\u65b0\uff0c\u53c2\u6570\u66f4\u65b0"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def step(self, closure): \n raise NotImplementedError\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"add_param_group()"}),"\uff1a\u6dfb\u52a0\u53c2\u6570\u7ec4"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def add_param_group(self, param_group):\n assert isinstance(param_group, dict), \"param group must be a dict\"\n# \u68c0\u67e5\u7c7b\u578b\u662f\u5426\u4e3atensor\n params = param_group['params']\n if isinstance(params, torch.Tensor):\n param_group['params'] = [params]\n elif isinstance(params, set):\n raise TypeError('optimizer parameters need to be organized in ordered collections, but '\n 'the ordering of tensors in sets will change between runs. Please use a list instead.')\n else:\n param_group['params'] = list(params)\n for param in param_group['params']:\n if not isinstance(param, torch.Tensor):\n raise TypeError(\"optimizer can only optimize Tensors, \"\n \"but one of the params is \" + torch.typename(param))\n if not param.is_leaf:\n raise ValueError(\"can't optimize a non-leaf Tensor\")\n\n for name, default in self.defaults.items():\n if default is required and name not in param_group:\n raise ValueError(\"parameter group didn't specify a value of required optimization parameter \" +\n name)\n else:\n param_group.setdefault(name, default)\n\n params = param_group['params']\n if len(params) != len(set(params)):\n warnings.warn(\"optimizer contains a parameter group with duplicate parameters; \"\n \"in future, this will cause an error; \"\n \"see github.com/PyTorch/PyTorch/issues/40967 for more information\", stacklevel=3)\n# \u4e0a\u9762\u597d\u50cf\u90fd\u5728\u8fdb\u884c\u4e00\u4e9b\u7c7b\u7684\u68c0\u6d4b\uff0c\u62a5Warning\u548cError\n param_set = set()\n for group in self.param_groups:\n param_set.update(set(group['params']))\n\n if not param_set.isdisjoint(set(param_group['params'])):\n raise ValueError(\"some parameters appear in more than one parameter group\")\n# \u6dfb\u52a0\u53c2\u6570\n self.param_groups.append(param_group)\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"load_state_dict()"})," \uff1a\u52a0\u8f7d\u72b6\u6001\u53c2\u6570\u5b57\u5178\uff0c\u53ef\u4ee5\u7528\u6765\u8fdb\u884c\u6a21\u578b\u7684\u65ad\u70b9\u7eed\u8bad\u7ec3\uff0c\u7ee7\u7eed\u4e0a\u6b21\u7684\u53c2\u6570\u8fdb\u884c\u8bad\u7ec3"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"def load_state_dict(self, state_dict):\n r\"\"\"Loads the optimizer state.\n\n Arguments:\n state_dict (dict): optimizer state. Should be an object returned\n from a call to :meth:`state_dict`.\n \"\"\"\n # deepcopy, to be consistent with module API\n state_dict = deepcopy(state_dict)\n # Validate the state_dict\n groups = self.param_groups\n saved_groups = state_dict['param_groups']\n\n if len(groups) != len(saved_groups):\n raise ValueError(\"loaded state dict has a different number of \"\n \"parameter groups\")\n param_lens = (len(g['params']) for g in groups)\n saved_lens = (len(g['params']) for g in saved_groups)\n if any(p_len != s_len for p_len, s_len in zip(param_lens, saved_lens)):\n raise ValueError(\"loaded state dict contains a parameter group \"\n \"that doesn't match the size of optimizer's group\")\n\n # Update the state\n id_map = {old_id: p for old_id, p in\n zip(chain.from_iterable((g['params'] for g in saved_groups)),\n chain.from_iterable((g['params'] for g in groups)))}\n\n def cast(param, value):\n r\"\"\"Make a deep copy of value, casting all tensors to device of param.\"\"\"\n \t\t.....\n\n # Copy state assigned to params (and cast tensors to appropriate types).\n # State that is not assigned to params is copied as is (needed for\n # backward compatibility).\n state = defaultdict(dict)\n for k, v in state_dict['state'].items():\n if k in id_map:\n param = id_map[k]\n state[param] = cast(param, v)\n else:\n state[k] = v\n\n # Update parameter groups, setting their 'params' value\n def update_group(group, new_group):\n ...\n param_groups = [\n update_group(g, ng) for g, ng in zip(groups, saved_groups)]\n self.__setstate__({'state': state, 'param_groups': param_groups})\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"state_dict()"}),"\uff1a\u83b7\u53d6\u4f18\u5316\u5668\u5f53\u524d\u72b6\u6001\u4fe1\u606f\u5b57\u5178"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'def state_dict(self):\n r"""Returns the state of the optimizer as a :class:`dict`.\n\n It contains two entries:\n\n * state - a dict holding current optimization state. Its content\n differs between optimizer classes.\n * param_groups - a dict containing all parameter groups\n """\n # Save order indices instead of Tensors\n param_mappings = {}\n start_index = 0\n\n def pack_group(group):\n\t\t......\n param_groups = [pack_group(g) for g in self.param_groups]\n # Remap state to use order indices as keys\n packed_state = {(param_mappings[id(k)] if isinstance(k, torch.Tensor) else k): v\n for k, v in self.state.items()}\n return {\n \'state\': packed_state,\n \'param_groups\': param_groups,\n }\n'})}),"\n",(0,s.jsx)(n.h2,{id:"392-\u5b9e\u9645\u64cd\u4f5c",children:"3.9.2 \u5b9e\u9645\u64cd\u4f5c"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'import os\nimport torch\n\n# \u8bbe\u7f6e\u6743\u91cd\uff0c\u670d\u4ece\u6b63\u6001\u5206\u5e03 --\x3e 2 x 2\nweight = torch.randn((2, 2), requires_grad=True)\n# \u8bbe\u7f6e\u68af\u5ea6\u4e3a\u51681\u77e9\u9635 --\x3e 2 x 2\nweight.grad = torch.ones((2, 2))\n# \u8f93\u51fa\u73b0\u6709\u7684weight\u548cdata\nprint("The data of weight before step:\\n{}".format(weight.data))\nprint("The grad of weight before step:\\n{}".format(weight.grad))\n# \u5b9e\u4f8b\u5316\u4f18\u5316\u5668\noptimizer = torch.optim.SGD([weight], lr=0.1, momentum=0.9)\n# \u8fdb\u884c\u4e00\u6b65\u64cd\u4f5c\noptimizer.step()\n# \u67e5\u770b\u8fdb\u884c\u4e00\u6b65\u540e\u7684\u503c\uff0c\u68af\u5ea6\nprint("The data of weight after step:\\n{}".format(weight.data))\nprint("The grad of weight after step:\\n{}".format(weight.grad))\n# \u6743\u91cd\u6e05\u96f6\noptimizer.zero_grad()\n# \u68c0\u9a8c\u6743\u91cd\u662f\u5426\u4e3a0\nprint("The grad of weight after optimizer.zero_grad():\\n{}".format(weight.grad))\n# \u8f93\u51fa\u53c2\u6570\nprint("optimizer.params_group is \\n{}".format(optimizer.param_groups))\n# \u67e5\u770b\u53c2\u6570\u4f4d\u7f6e\uff0coptimizer\u548cweight\u7684\u4f4d\u7f6e\u4e00\u6837\uff0c\u6211\u89c9\u5f97\u8fd9\u91cc\u53ef\u4ee5\u53c2\u8003Python\u662f\u57fa\u4e8e\u503c\u7ba1\u7406\nprint("weight in optimizer:{}\\nweight in weight:{}\\n".format(id(optimizer.param_groups[0][\'params\'][0]), id(weight)))\n# \u6dfb\u52a0\u53c2\u6570\uff1aweight2\nweight2 = torch.randn((3, 3), requires_grad=True)\noptimizer.add_param_group({"params": weight2, \'lr\': 0.0001, \'nesterov\': True})\n# \u67e5\u770b\u73b0\u6709\u7684\u53c2\u6570\nprint("optimizer.param_groups is\\n{}".format(optimizer.param_groups))\n# \u67e5\u770b\u5f53\u524d\u72b6\u6001\u4fe1\u606f\nopt_state_dict = optimizer.state_dict()\nprint("state_dict before step:\\n", opt_state_dict)\n# \u8fdb\u884c5\u6b21step\u64cd\u4f5c\nfor _ in range(50):\n optimizer.step()\n# \u8f93\u51fa\u73b0\u6709\u72b6\u6001\u4fe1\u606f\nprint("state_dict after step:\\n", optimizer.state_dict())\n# \u4fdd\u5b58\u53c2\u6570\u4fe1\u606f\ntorch.save(optimizer.state_dict(),os.path.join(r"D:\\pythonProject\\Attention_Unet", "optimizer_state_dict.pkl"))\nprint("----------done-----------")\n# \u52a0\u8f7d\u53c2\u6570\u4fe1\u606f\nstate_dict = torch.load(r"D:\\pythonProject\\Attention_Unet\\optimizer_state_dict.pkl") # \u9700\u8981\u4fee\u6539\u4e3a\u4f60\u81ea\u5df1\u7684\u8def\u5f84\noptimizer.load_state_dict(state_dict)\nprint("load state_dict successfully\\n{}".format(state_dict))\n# \u8f93\u51fa\u6700\u540e\u5c5e\u6027\u4fe1\u606f\nprint("\\n{}".format(optimizer.defaults))\nprint("\\n{}".format(optimizer.state))\nprint("\\n{}".format(optimizer.param_groups))\n'})}),"\n",(0,s.jsx)(n.h2,{id:"393-\u8f93\u51fa\u7ed3\u679c",children:"3.9.3 \u8f93\u51fa\u7ed3\u679c"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# \u8fdb\u884c\u66f4\u65b0\u524d\u7684\u6570\u636e\uff0c\u68af\u5ea6\nThe data of weight before step:\ntensor([[-0.3077, -0.1808],\n [-0.7462, -1.5556]])\nThe grad of weight before step:\ntensor([[1., 1.],\n [1., 1.]])\n# \u8fdb\u884c\u66f4\u65b0\u540e\u7684\u6570\u636e\uff0c\u68af\u5ea6\nThe data of weight after step:\ntensor([[-0.4077, -0.2808],\n [-0.8462, -1.6556]])\nThe grad of weight after step:\ntensor([[1., 1.],\n [1., 1.]])\n# \u8fdb\u884c\u68af\u5ea6\u6e05\u96f6\u7684\u68af\u5ea6\nThe grad of weight after optimizer.zero_grad():\ntensor([[0., 0.],\n [0., 0.]])\n# \u8f93\u51fa\u4fe1\u606f\noptimizer.params_group is \n[{'params': [tensor([[-0.4077, -0.2808],\n [-0.8462, -1.6556]], requires_grad=True)], 'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}]\n\n# \u8bc1\u660e\u4e86\u4f18\u5316\u5668\u7684\u548cweight\u7684\u50a8\u5b58\u662f\u5728\u4e00\u4e2a\u5730\u65b9\uff0cPython\u57fa\u4e8e\u503c\u7ba1\u7406\nweight in optimizer:1841923407424\nweight in weight:1841923407424\n \n# \u8f93\u51fa\u53c2\u6570\noptimizer.param_groups is\n[{'params': [tensor([[-0.4077, -0.2808],\n [-0.8462, -1.6556]], requires_grad=True)], 'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}, {'params': [tensor([[ 0.4539, -2.1901, -0.6662],\n [ 0.6630, -1.5178, -0.8708],\n [-2.0222, 1.4573, 0.8657]], requires_grad=True)], 'lr': 0.0001, 'nesterov': True, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0}]\n\n# \u8fdb\u884c\u66f4\u65b0\u524d\u7684\u53c2\u6570\u67e5\u770b\uff0c\u7528state_dict\nstate_dict before step:\n {'state': {0: {'momentum_buffer': tensor([[1., 1.],\n [1., 1.]])}}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0]}, {'lr': 0.0001, 'nesterov': True, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'params': [1]}]}\n# \u8fdb\u884c\u66f4\u65b0\u540e\u7684\u53c2\u6570\u67e5\u770b\uff0c\u7528state_dict\nstate_dict after step:\n {'state': {0: {'momentum_buffer': tensor([[0.0052, 0.0052],\n [0.0052, 0.0052]])}}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0]}, {'lr': 0.0001, 'nesterov': True, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'params': [1]}]}\n\n# \u5b58\u50a8\u4fe1\u606f\u5b8c\u6bd5\n----------done-----------\n# \u52a0\u8f7d\u53c2\u6570\u4fe1\u606f\u6210\u529f\nload state_dict successfully\n# \u52a0\u8f7d\u53c2\u6570\u4fe1\u606f\n{'state': {0: {'momentum_buffer': tensor([[0.0052, 0.0052],\n [0.0052, 0.0052]])}}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0]}, {'lr': 0.0001, 'nesterov': True, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'params': [1]}]}\n\n# defaults\u7684\u5c5e\u6027\u8f93\u51fa\n{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}\n\n# state\u5c5e\u6027\u8f93\u51fa\ndefaultdict(<class 'dict'>, {tensor([[-1.3031, -1.1761],\n [-1.7415, -2.5510]], requires_grad=True): {'momentum_buffer': tensor([[0.0052, 0.0052],\n [0.0052, 0.0052]])}})\n\n# param_groups\u5c5e\u6027\u8f93\u51fa\n[{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [tensor([[-1.3031, -1.1761],\n [-1.7415, -2.5510]], requires_grad=True)]}, {'lr': 0.0001, 'nesterov': True, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'params': [tensor([[ 0.4539, -2.1901, -0.6662],\n [ 0.6630, -1.5178, -0.8708],\n [-2.0222, 1.4573, 0.8657]], requires_grad=True)]}]\n\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"\u6ce8\u610f\uff1a"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"\u6bcf\u4e2a\u4f18\u5316\u5668\u90fd\u662f\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u4e00\u5b9a\u8981\u8fdb\u884c\u5b9e\u4f8b\u5316\u624d\u80fd\u4f7f\u7528\uff0c\u6bd4\u5982\u4e0b\u65b9\u5b9e\u73b0\uff1a"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"class Net(nn.Moddule):\n \xb7\xb7\xb7\nnet = Net()\noptim = torch.optim.SGD(net.parameters(),lr=lr)\noptim.step()\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["optimizer\u5728\u4e00\u4e2a\u795e\u7ecf\u7f51\u7edc\u7684epoch\u4e2d\u9700\u8981\u5b9e\u73b0\u4e0b\u9762\u4e24\u4e2a\u6b65\u9aa4\uff1a\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"\u68af\u5ea6\u7f6e\u96f6"}),"\n",(0,s.jsx)(n.li,{children:"\u68af\u5ea6\u66f4\u65b0"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"optimizer = torch.optim.SGD(net.parameters(), lr=1e-5)\nfor epoch in range(EPOCH):\n\t...\n\toptimizer.zero_grad() #\u68af\u5ea6\u7f6e\u96f6\n\tloss = ... #\u8ba1\u7b97loss\n\tloss.backward() #BP\u53cd\u5411\u4f20\u64ad\n\toptimizer.step() #\u68af\u5ea6\u66f4\u65b0\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsx)(n.li,{children:"\u7ed9\u7f51\u7edc\u4e0d\u540c\u7684\u5c42\u8d4b\u4e88\u4e0d\u540c\u7684\u4f18\u5316\u5668\u53c2\u6570\u3002"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"from torch import optim\nfrom torchvision.models import resnet18\n\nnet = resnet18()\n\noptimizer = optim.SGD([\n {'params':net.fc.parameters()},#fc\u7684lr\u4f7f\u7528\u9ed8\u8ba4\u76841e-5\n {'params':net.layer4[0].conv1.parameters(),'lr':1e-2}],lr=1e-5)\n\n# \u53ef\u4ee5\u4f7f\u7528param_groups\u67e5\u770b\u5c5e\u6027\n"})}),"\n",(0,s.jsx)(n.h2,{id:"394-\u5b9e\u9a8c",children:"3.9.4 \u5b9e\u9a8c"}),"\n",(0,s.jsx)(n.p,{children:"\u4e3a\u4e86\u66f4\u597d\u7684\u5e2e\u5927\u5bb6\u4e86\u89e3\u4f18\u5316\u5668\uff0c\u6211\u4eec\u5bf9PyTorch\u4e2d\u7684\u4f18\u5316\u5668\u8fdb\u884c\u4e86\u4e00\u4e2a\u5c0f\u6d4b\u8bd5"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"\u6570\u636e\u751f\u6210"}),"\uff1a"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"a = torch.linspace(-1, 1, 1000)\n# \u5347\u7ef4\u64cd\u4f5c\nx = torch.unsqueeze(a, dim=1)\ny = x.pow(2) + 0.1 * torch.normal(torch.zeros(x.size()))\n"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"\u6570\u636e\u5206\u5e03\u66f2\u7ebf"}),"\uff1a"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:r(35281).A+"",width:"640",height:"480"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"\u7f51\u7edc\u7ed3\u6784"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"class Net(nn.Module):\n def __init__(self):\n super(Net, self).__init__()\n self.hidden = nn.Linear(1, 20)\n self.predict = nn.Linear(20, 1)\n\n def forward(self, x):\n x = self.hidden(x)\n x = F.relu(x)\n x = self.predict(x)\n return x\n\n"})}),"\n",(0,s.jsx)(n.p,{children:"\u4e0b\u9762\u8fd9\u90e8\u5206\u662f\u6d4b\u8bd5\u56fe\uff0c\u7eb5\u5750\u6807\u4ee3\u8868Loss\uff0c\u6a2a\u5750\u6807\u4ee3\u8868\u7684\u662fStep\uff1a"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{src:r(10618).A+"",width:"640",height:"480"})}),"\n",(0,s.jsx)(n.p,{children:"\u5728\u4e0a\u9762\u7684\u56fe\u7247\u4e0a\uff0c\u66f2\u7ebf\u4e0b\u964d\u7684\u8d8b\u52bf\u548c\u5bf9\u5e94\u7684steps\u4ee3\u8868\u4e86\u5728\u8fd9\u8f6e\u6570\u636e\uff0c\u6a21\u578b\u4e0b\u7684\u6536\u655b\u901f\u5ea6"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"\u6ce8\u610f:"})}),"\n",(0,s.jsx)(n.p,{children:"\u4f18\u5316\u5668\u7684\u9009\u62e9\u662f\u9700\u8981\u6839\u636e\u6a21\u578b\u8fdb\u884c\u6539\u53d8\u7684\uff0c\u4e0d\u5b58\u5728\u7edd\u5bf9\u7684\u597d\u574f\u4e4b\u5206\uff0c\u6211\u4eec\u9700\u8981\u591a\u8fdb\u884c\u4e00\u4e9b\u6d4b\u8bd5\u3002"})]})}function c(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}}}]);