Educode -- PyTorch を使用して MNIST データセット上で畳み込みニューラル ネットワークをトレーニングする

タスク 1:

最初のレベル: PyTorch を使用してネットワーク モデルを構築する

引数解析をインポートする

輸入トーチ

torch.nn を nn としてインポート

torch.nn.functionをFとしてインポート

torch.optim を optim としてインポートします

torchvision からのインポート データセット、変換

torch.optim.lr_scheduler から StepLR をインポート


 

クラスネット(nn.モジュール):

    def __init__(自分自身):

        ########## 始める ##########

        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(1, 32, 3, 1)

        self.conv2 = nn.Conv2d(32, 64, 3, 1)

        self.dropout1 = nn.Dropout(0.25)

        self.dropout2 = nn.Dropout(0.5)

        self.fc1 = nn.Linear(9216, 128)

        self.fc2 = nn.Linear(128, 10)

        ########## 終わり ##########

    def forward(self, x):

        ########## 始める ##########

        x = self.conv1(x)

        x = F.relu(x)

        x = self.conv2(x)

        x = F.relu(x)

        x = F.max_pool2d(x, 2)

        x = self.dropout1(x)

        x = トーチ.フラットテン(x, 1)

        x = self.fc1(x)

        x = F.relu(x)

        x = self.dropout2(x)

        x = self.fc2(x)

        出力 = F.log_softmax(x, dim=1)

        出力を返す

        ########## 終わり ##########

第 2 レベル: PyTorch を使用してネットワーク モデルをトレーニングする

__future__ から print_function をインポート

引数解析をインポートする

輸入トーチ

torch.nn を nn としてインポート

torch.nn.functionをFとしてインポート

torch.optim を optim としてインポートします

torchvision からのインポート データセット、変換

torch.optim.lr_scheduler から StepLR をインポート


 

クラスネット(nn.モジュール):

    def __init__(自分自身):

        ########## 始める ##########

        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(1, 32, 3, 1)

        self.conv2 = nn.Conv2d(32, 64, 3, 1)

        self.dropout1 = nn.Dropout(0.25)

        self.dropout2 = nn.Dropout(0.5)

        self.fc1 = nn.Linear(9216, 128)

        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):

        x = self.conv1(x)

        x = F.relu(x)

        x = self.conv2(x)

        x = F.relu(x)

        x = F.max_pool2d(x, 2)

        x = self.dropout1(x)

        x = トーチ.フラットテン(x, 1)

        x = self.fc1(x)

        x = F.relu(x)

        x = self.dropout2(x)

        x = self.fc2(x)

        出力 = F.log_softmax(x, dim=1)

        出力を返す

        ########## 終わり ##########


 

def train(引数、モデル、デバイス、train_loader、オプティマイザー、エポック):

    ########## 始める ##########

    バッチ_idx の場合、(データ、ターゲット) の enumerate(train_loader):

        データ、ターゲット = data.to(デバイス)、ターゲット.to(デバイス)

        オプティマイザー.zero_grad()

        出力 = モデル(データ)

        loss = F.nll_loss(出力, ターゲット)

        loss.backward()

        オプティマイザー.ステップ()

    ########## 終わり ##########

        バッチ_idx % args.log_interval == 0 の場合:

            print('トレイン エポック: {} [{}/{} ({:.0f}%)]\t損失: {:.6f}'.format(

                エポック、batch_idx * len(データ)、len(train_loader.dataset)、

                100. * バッチ_idx / len(train_loader), loss.item()))

            args.dry_run の場合:

                壊す


 

def test(モデル、デバイス、test_loader):

    モデル.eval()

    テストロス = 0

    正解 = 0

    torch.no_grad() を使用:

        データの場合、test_loader のターゲット:

            データ、ターゲット = data.to(デバイス)、ターゲット.to(デバイス)

            出力 = モデル(データ)

            test_loss += F.nll_loss(output, target,duction='sum').item() # バッチ損失を合計します

            pred = Output.argmax(dim=1, keepdim=True) # 最大対数確率のインデックスを取得します

            正しい += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_loader.dataset)

    test_acc = 100. * 正しい / len(test_loader.dataset)

    print('\nテストセット: 平均損失: {:.4f}、精度: {}/{} ({:.0f}%)\n'.format(

        test_loss、正しい、len(test_loader.dataset)、

        テスト_acc))

    test_acc > 95 の場合:

        print("成功!")

def main():

    # トレーニング設定

    parser = argparse.ArgumentParser(description='PyTorch MNIST の例')

    parser.add_argument('--batch-size'、type=int、default=64、metavar='N'、

                        help='トレーニング用の入力バッチ サイズ (デフォルト: 64)')

    parser.add_argument('--test-batch-size'、type=int、default=1000、metavar='N'、

                        help='テスト用のバッチ サイズを入力 (デフォルト: 1000)')

    parser.add_argument('--epochs'、type=int、default=1、metavar='N'、

                        help='トレーニングするエポック数 (デフォルト: 14)')

    parser.add_argument('--lr'、type=float、default=1.0、metavar='LR'、

                        help='学習率 (デフォルト: 1.0)')

    parser.add_argument('--gamma'、type=float、default=0.7、metavar='M'、

                        help='学習率ステップガンマ (デフォルト: 0.7)')

    parser.add_argument('--no-cuda'、action='store_true'、default=False、

                        help='CUDA トレーニングを無効にする')

    parser.add_argument('--dry-run'、action='store_true'、default=False、

                        help='単一パスを簡単にチェック')

    parser.add_argument('--seed'、type=int、default=1、metavar='S'、

                        help='ランダムシード (デフォルト: 1)')

    parser.add_argument('--log-interval'、type=int、default=10、metavar='N'、

                        help='トレーニングステータスを記録するまでに待機するバッチ数')

    parser.add_argument('--save-model'、action='store_true'、default=False、

                        help='現在のモデルを保存する場合')

    args = parser.parse_args()

    use_cuda = args.no_cuda および torch.cuda.is_available() ではありません

    torch.manual_seed(args.seed)

    device = torch.device("cuda" if use_cuda else "cpu")

    train_kwargs = {'batch_size': args.batch_size}

    test_kwargs = {'batch_size': args.test_batch_size}

    use_cuda の場合:

        cuda_kwargs = {'num_workers': 1,

                       'pin_memory': True、

                       'シャッフル': True}

        train_kwargs.update(cuda_kwargs)

        test_kwargs.update(cuda_kwargs)

    変換=transforms.Compose([

        変換.ToTensor()、

        変換.Normalize((0.1307,), (0.3081,))

        ])

    dataset1 = datasets.MNIST('/data/workspace/myshixun/data', train=True, download=True,

                       変換=変換)

    dataset2 = datasets.MNIST('/data/workspace/myshixun/data', train=False,

                       変換=変換)

    train_loader = torch.utils.data.DataLoader(dataset1,**train_kwargs)

    test_loader = torch.utils.data.DataLoader(dataset2, **test_kwargs)

    モデル = Net().to(デバイス)

    optimizer = optim.Adadelta(model.parameters(), lr=args.lr)

    スケジューラー = StepLR(オプティマイザー、step_size=1、gamma=args.gamma)

    range(1, args.epochs + 1) 内のエポックの場合:

        train(引数、モデル、デバイス、train_loader、オプティマイザー、エポック)

        テスト(モデル、デバイス、test_loader)

        スケジューラー.ステップ()

    args.save_model の場合:

        torch.save(model.state_dict(), "mnist_cnn.pt")


 

__name__ == '__main__'の場合:

    主要()

おすすめ

転載: blog.csdn.net/qq_57409899/article/details/125468360