CIFAR10分類(AlexNet)

!は/ usr / binに/のenvのpython 
#のエンコーディング:UTF-8 
''」
@author:liualex 
@contact:[email protected] 
@software:pycharm 
@file:main.py 
@time:2019年8月16日16: 21 
@desc:
「」」

インポートトーチ
 インポートとしてNN torch.nn
 インポートtorchvisionの
 インポート変換としてtorchvision.transforms
 インポートデータローダとしてtorch.utils.data.dataloader
 インポートPDB
 インポートのOS 
はos.environ [ CUDA_VISIBLE_DEVICES  = 3 

変換 =transforms.Compose(
    [ 
     transforms.RandomHorizo​​ntalFlip()、
     transforms.RandomGrayscale()、
     transforms.ToTensor()、
     transforms.Normalize(( 0.5、0.5、0.5)、(0.5、0.5、0.5 ))
    ] 


train_set = torchvision.datasets .CIFAR10(
    ルート = " ./data " 
    ダウンロード = Trueの場合、
    電車 = Trueの場合、
    変換 = 変換

train_loader = dataloader.DataLoader(
    データセット = train_set、 
    BATCH_SIZE = 100
    シャッフル = 

test_set = torchvision.datasets.CIFAR10(
    ルート = " ./data " 
    ダウンロード = 真、
    電車 = Falseを、
    変換 = 変換
test_loader = dataloader.DataLoader(
    データセット = test_set、
    BATCH_SIZE = 100 
    シャッフル = 

クラスAlexNet(nn.Module):

    デフ __init__ (自己、class_num):
        スーパー(AlexNet、自己)。__init__ ()
        self.features = nn.Sequential(
            nn.Conv2d( 3、64、kernel_size = 3、ストライド= 1、パディング= 1 )、
            nn.ReLU(インプレース = TRUE)、
            nn.MaxPool2d(kernel_size = 2、ストライド= 2 )、
            nn.Conv2d( 64、192、kernel_size = 3、ストライド= 1、パディング= 1 )、
            nn.ReLU(インプレース = TRUE)、
            nn.MaxPool2d(kernel_size = 2、ストライド= 2 )、
            nn.Conv2d ( 192、384、kernel_size = 3、ストライド= 1、パディング= 1 )、
            nn.ReLU(インプレース =真)、
            nn.Conv2d( 384、256、kernel_size = 3、ストライド= 1、パディング= 1 )、
            nn.ReLU(インプレース = 真)、
            nn.Conv2d( 256、256、kernel_size = 3、パディング= 1 )、
            nn.ReLU(インプレース = TRUE)、
            nn.MaxPool2d(kernel_size = 2、ストライド= 2 )、 
        self.classifier = nn.Sequential(
            nn.Dropout()、
            nn.Linear( 256 * 4 * 4、4096 )、
            nn.ReLU(インプレース = TRUE)、 
            nn.Dropout()、
            nn.Linear( 4096、4096 )、
            nn.ReLU(インプレース = TRUE)、
            nn.Linear( 4096 、class_num)、 

    デフ前方(自己、X):
        X = self.features(x)は
        、X = x.view(x.size(0)、256 * 4×4 
        X = self.classifier(X)
         リターンXの


デバイス = torch.device(" CUDA "  なら torch.cuda.is_available() " CPU " 
モデル = AlexNet(10 
model.to(デバイス)

epoches 
LR = 100 = 0.001 
基準 = nn.CrossEntropyLoss()
オプティマイザ = torch.optim.Adam(model.parameters()、LR = LR)

のためのエポックにおける範囲(epoches)
     のための I、(画像、ラベル)列挙(train_loader ):
        画像 = images.to(装置)
        ラベル = labels.to(デバイス)

        出力 = モデル(画像)
        損失 = 基準(出力ラベル)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        もし(I + 1) %100 == 0:
             プリント' エポック[{} / {}]、損失:{:.4f} ' 
                  .format(エポック + 1 、epoches、loss.item()))

トーチを有します。 no_grad():
    正しい = 0 
    合計 = 0
     のために(画像、ラベル)test_loader:
        画像、ラベル = images.to(デバイス)、labels.to(デバイス)
        出力 = モデル(画像)
        _は、予測された(= torch.maxをoutput.data、1 
        合計 + = labels.size(0)
         pdb.set_trace()
        正しい+ =(予測== 。ラベル).SUM()項目()

    プリント" 合計{}イメージの精度:{}%" .format)合計/正しい(合計、100 *)

畳み込み計算式:N =(W - F.  + 2 P  )/ S + +1、Wは、入力画像のサイズをいい、ここで、Fは、コンボリューションカーネルのサイズを指し、Pは、パディングを意味し、Sはストライドを指し

結果:のみのみ78.57パーセントの結果、100回繰り返さので。

おすすめ

転載: www.cnblogs.com/liualexsone/p/11366012.html