Pytorch MNISTのための畳み込みニューラルネットワークの分類を構築

インポートトーチ
 から torch.utils.data インポートデータローダ
 から torchvisionのインポートデータセット
 から torchvisionのインポート変換
 からトーチインポート、NN OPTIMを
 から torch.nn インポートとして機能F 

EPOCH = 1000 
BATCH_SIZE = 128 
LR = 0.001 
DOWNLOAD_MNIST = Falseの

train_data = datasets.MNIST(
    ルート = ' ./mnist ' 
    電車 =確かに、
    変換 = transforms.Compose([ 
                           transforms.ToTensor()、
                           transforms.Normalize(( 0.1307)、(0.3081 、))
                       ])、 0-255 - > 0-1 
    ダウンロード= DOWNLOAD_MNIST 
#のプロットの一例を
印刷(train_data.train_data.size())
 プリント(train_data.train_labels.size())
plt.imshow(train_data.train_data [0] .nu​​mpy()、CMAP = ' グレー' 
plt.title(' %I '%のtrain_data .train_labels [0]) 
PLT .SHOW()

train_loader=データローダー(データセット= train_data、BATCH_SIZE = BATCH_SIZE、\ 
                               シャッフル =真、num_workers = 2 


TEST_DATA = datasets.MNIST(
    ルート = ' ./mnist ' 
    電車 = Falseを、
    変換 = transforms.Compose([ 
                           transforms.ToTensor() 、
                           transforms.Normalize(( 0.1307)(0.3081 ))
                       ])、 0-255 - > 0-1 
    ダウンロード= DOWNLOAD_MNIST 
test_loader=データローダー(データセット= TEST_DATA、BATCH_SIZE = BATCH_SIZE、\ 
                               シャッフル =真、num_workers = 2 

のx、ラベル = ITER(test_loader).next()  这个ITER能把一个BATCH_SIZE提取出来
印刷" X:"、X。形状、' ラベル:' 、label.shape)



クラスCNN(nn.Module):
     デフ __init__ (自己):
        スーパー(CNN、自己)。__init__ ()
        self.conv1 = nn.Sequential(         入力形状(1、28、28)
            nn.Conv2d(
                in_channels= 1、               #1 入力高 
                out_channels = 10、            n_filters 
                kernel_size = 5、               #1 フィルタサイズ 
                ストライド= 1、                    #1 フィルタ移動/ステップ 
                パディング= 2、                  Conv2d、パディングした後、この画像の同じ幅及び長さが必要な場合=(kernel_size- 1)/ 2ストライド= 1の場合 
            )、                              出力形状(16、28、28) 
            nn.ReLU()、                      活性化 
            nn.MaxPool2d(kernel_size = 2)、    2x2の領域で最大値を選択し、出力形状(16、14、14) 

        self.conv2 = nn.Sequential(         入力形状(16、14、14) 
            、nn.Conv2d(10、20、5、1、2)      #の出力形状(32、14、14) 
            nn.ReLU()、活性化 
            nn.MaxPool2d(2)、                出力形状(32、7、7) 

        self.out1 = nn.Linear(20 * 7 * 7、 512)   完全接続層、出力10クラス 
        self.out2 = nn.Linear(512、10 DEF フォワード(自己、X):
        X =self.conv1(X)
        X = self.conv2(X)
        X = x.view(x.size(0)-1)            (BATCH_SIZE、32 * 7 * 7)にCONV2の出力平坦化 
        出力= 自己。 (x)はOUT1 
        出力 = F.relu(出力)
        出力 = self.out2(出力)
         リターン出力     #の可視化のためのリターンX 

DEVICE = torch.device(" CUDA "  の場合 torch.cuda.is_available()それ以外の " CPU " 
CNN = CNN()。(デバイス)に
 印刷(CNN)   #1 ネットのアーキテクチャ 
オプティマイザ= optim.Adam(cnn.parameters()、LR = LR)   すべてのCNNは、パラメータ最適化 
criteon = nn.CrossEntropyLoss()。(DEVICE)へ                      ターゲットラベルは一hottedない

デフ電車(モデル、デバイス、train_loader、オプティマイザ、エポック):
    model.train()
    のため batch_idx、(データ、ターゲット)列挙(train_loader):
        データ、ターゲット = data.to(デバイス)、target.to(デバイス)
        出力 = モデル(データの)
        損失 = 基準(出力、ターゲット) 
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        であれば(batch_idx + 1)%30 == 0: 
             プリント' 列車エポック:{} [{} / {}({:.0f}%)] \ TLOSS:{: .6f} ' .format(
                エポック、batch_idx * lenは(データ)、LEN(train_loader.dataset)、
                 100 * batch_idx / LEN(train_loader)、loss.item()))


デフ試験(モデル、デバイス、test_loader)。
    model.eval()
    test_loss = 0 
    正しい = 0 
    (torch.no_grad有する)
        のためのデータ、対象におけるtest_loader。 
            データ、ターゲット = data.to(デバイス)、target.to(デバイス)
            出力 = モデル(データ)
            PRED = output.argmax(暗く= 1 
            正しい + = torch.eq(predは、ターゲット).FLOAT()。和( ).item()
            test_loss + = 基準(出力、ターゲット)
            
#1              test_loss + = F.nll_loss(出力、標的、減少= '和')。項目()#将一批的损失相加             PRED = output.max (1、keepdim = TRUE)[1]#找到概率最大的下标             正しい+ = pred.eq(target.view_as(predを))。和()項目()

    test_loss / = LEN(test_loader.dataset)
     印刷 '\セットNTEST:平均損失:{:.4f}、精度:{} / {}({:.0f}%)\ n ' .format(
        test_loss、正しい、LEN(test_loader.dataset)、
         100 *正しいです/ LEN(test_loader.dataset))) 



トレーニングとテスト
のためのエポックでの範囲(EPOCH):
    電車(CNN、DEVICE、train_loader、オプティマイザ、エポック)
    テスト(CNN、DEVICE、test_loader)

99%の正解率を得ることができる。最後

おすすめ

転載: www.cnblogs.com/yqpy/p/11329157.html