{"id":1187,"date":"2025-11-08T13:49:46","date_gmt":"2025-11-08T05:49:46","guid":{"rendered":"http:\/\/xinyixx.com\/?p=1187"},"modified":"2025-11-08T14:04:39","modified_gmt":"2025-11-08T06:04:39","slug":"pixel","status":"publish","type":"post","link":"https:\/\/www.xinyixx.com\/index.php\/2025\/11\/08\/pixel\/","title":{"rendered":"\u5982\u4f55\u5b9e\u73b0\u8d85\u5206\u8fa8\u7387"},"content":{"rendered":"\n<p>\u4ee5\u4e0b\u662f\u4f7f\u7528PyTorch\u5b9e\u73b0\u8d85\u5206\u8fa8\u7387\u7684\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader\nfrom torchvision import transforms\nfrom torchvision.datasets import ImageFolder\n\n\n# \u5b9a\u4e49\u8d85\u5206\u8fa8\u7387\u6a21\u578b\nclass SRModel(nn.Module):\n    def __init__(self):\n        super(SRModel, self).__init__()\n        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)\n        self.conv2 = nn.Conv2d(64, 64, kernel_size=3, padding=1)\n        self.conv3 = nn.Conv2d(64, 32, kernel_size=3, padding=1)\n        self.conv4 = nn.Conv2d(32, 3, kernel_size=3, padding=1)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        out = self.relu(self.conv1(x))\n        out = self.relu(self.conv2(out))\n        out = self.relu(self.conv3(out))\n        out = self.conv4(out)\n        return out\n\n\n# \u5b9a\u4e49\u8d85\u5206\u8fa8\u7387\u8bad\u7ec3\u51fd\u6570\ndef train_sr_model(model, train_loader, val_loader, num_epochs=10, lr=0.001):\n    criterion = nn.MSELoss()\n    optimizer = optim.Adam(model.parameters(), lr=lr)\n    for epoch in range(num_epochs):\n        # \u8bad\u7ec3\u6a21\u578b\n        model.train()\n        train_loss = 0.0\n        for i, (inputs, targets) in enumerate(train_loader):\n            optimizer.zero_grad()\n            outputs = model(inputs)\n            loss = criterion(outputs, targets)\n            loss.backward()\n            optimizer.step()\n            train_loss += loss.item() * inputs.size(0)\n        train_loss \/= len(train_loader.dataset)\n\n        # \u9a8c\u8bc1\u6a21\u578b\n        model.eval()\n        val_loss = 0.0\n        with torch.no_grad():\n            for inputs, targets in val_loader:\n                outputs = model(inputs)\n                loss = criterion(outputs, targets)\n                val_loss += loss.item() * inputs.size(0)\n            val_loss \/= len(val_loader.dataset)\n\n        # \u6253\u5370\u8bad\u7ec3\u4fe1\u606f\n        print(f\"Epoch {epoch+1}\/{num_epochs}: Train Loss={train_loss:.4f}, Val Loss={val_loss:.4f}\")\n\n\n# \u52a0\u8f7d\u6570\u636e\u96c6\ntrain_transforms = transforms.Compose(&#91;\n    transforms.Resize((256, 256)),\n    transforms.RandomCrop(224),\n    transforms.ToTensor(),\n])\nval_transforms = transforms.Compose(&#91;\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])\ntrain_dataset = ImageFolder(\"path\/to\/train\/dataset\", transform=train_transforms)\nval_dataset = ImageFolder(\"path\/to\/val\/dataset\", transform=val_transforms)\ntrain_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=8)\n\n# \u521b\u5efa\u6a21\u578b\u5e76\u8bad\u7ec3\nmodel = SRModel()\ntrain_sr_model(model, train_loader, val_loader)<\/code><\/pre>\n\n\n\n<p>\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u8d85\u5206\u8fa8\u7387\u6a21\u578b\uff0c\u5b83\u4f7f\u7528MSE\u635f\u5931\u51fd\u6570\u548cAdam\u4f18\u5316\u5668\u8fdb\u884c\u8bad\u7ec3\u3002\u60a8\u53ef\u4ee5\u6839\u636e\u9700\u8981\u66f4\u6539\u6a21\u578b\u67b6\u6784\u3001\u635f\u5931\u51fd\u6570\u3001\u4f18\u5316\u5668\u548c\u8d85\u53c2\u6570\u7b49\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5728GitHub\u4e0a\u5b9e\u73b0\u8d85\u5206\u8fa8\u7387\u7684\u9879\u76ee\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/krasserm\/pytorch-super-resolution\">pytorch-super-resolution<\/a>\uff1a\u4f7f\u7528PyTorch\u5b9e\u73b0\u7684\u591a\u79cd\u8d85\u5206\u8fa8\u7387\u7b97\u6cd5\uff0c\u5305\u62ecSRCNN\u3001ESPCN\u3001SRGAN\u7b49\u3002<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/xinntao\/Super-Resolution.Pytorch\">Super-Resolution.Pytorch<\/a>\uff1a\u5305\u542b\u591a\u79cd\u8d85\u5206\u8fa8\u7387\u7b97\u6cd5\u7684PyTorch\u5b9e\u73b0\uff0c\u540c\u65f6\u4e5f\u63d0\u4f9b\u4e86\u9884\u8bad\u7ec3\u6a21\u578b\u3002<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/utkuozbulak\/pytorch-cnn-visualizations\">pytorch-cnn-visualizations<\/a>\uff1a\u4f7f\u7528PyTorch\u5b9e\u73b0\u7684\u591a\u79cd\u5377\u79ef\u795e\u7ecf\u7f51\u7edc\u53ef\u89c6\u5316\u6280\u672f\uff0c\u5305\u62ec\u8d85\u5206\u8fa8\u7387\u3002<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee5\u4e0b\u662f\u4f7f\u7528PyTorch\u5b9e\u73b0\u8d85\u5206\u8fa8\u7387\u7684\u793a\u4f8b\u4ee3\u7801\uff1a \u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u8d85\u5206\u8fa8\u7387\u6a21\u578b\uff0c\u5b83\u4f7f\u7528MSE\u635f\u5931\u51fd\u6570\u548cAdam\u4f18 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1187","post","type-post","status-publish","format-standard","hentry","category-other","entry"],"_links":{"self":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/1187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/comments?post=1187"}],"version-history":[{"count":1,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/1187\/revisions"}],"predecessor-version":[{"id":7412,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/1187\/revisions\/7412"}],"wp:attachment":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/media?parent=1187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/categories?post=1187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/tags?post=1187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}