インポートトーチ から 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] .numpy()、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%の正解率を得ることができる。最後