AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Kaggleに挑戦-31

Kaggleに挑戦-31

Peking University/Baidu - Autonomous Driving

Can you predict vehicle angle in different settings?

*1月21日の締め切りに向けて、お手本のプログラムコードを理解し、動かし、性能向上を図る。

*Kaggleの利用規約の最新版が送られてきた。規約遵守のため、Kaggleで得た情報を具体的に表示するのはやめる。

 

*今日は、fastaiとPytorchの勉強と、お手本プログラムの解読

 

*fastai:以前、fastaiを使いたいと思ってインストールしようとしたら、Linux限定で、Windowsは、十分には検証していないとのことだった。fastaiのHPの記述は、今も変わっていない。

Windows support is at an experimental stage: it should work fine but it's much slower and less well tested. 」

・何もしないのでは、前に進めないので、fastaiのインストール手順に従って、condaでfastaiをインストールしてみる。

・Ananonda Promptから、conda install -c pytorch -c fastai fastaiを実行した。

・そのあと、いつも使っているKerasのstyle transferとDeepDreamが動作することを確認した。いずれも、問題なく動作しているようだ。

・Fastaiのビデオレクチャーに従って、自分の計算環境でjupyter notebookを立ち上げ、コマンドを入力し、Cell単位で実行して、結果を比較した。

*事例は、7390枚のイヌとネコの画像から、37種類のイヌとネコの種類を分類するというもの。'Abyssinian', 'Bengal', 'Birman', 'Bombay', 'British_Shorthair', 'Egyptian_Mau', 'Maine_Coon', 'Persian', 'Ragdoll', 'Russian_Blue', 'Siamese', 'Sphynx', 'american_bulldog', 'american_pit_bull_terrier', 'basset_hound', 'beagle', 'boxer', 'chihuahua', 'english_cocker_spaniel', 'english_setter', 'german_shorthaired', 'great_pyrenees', 'havanese', 'japanese_chin', 'keeshond', 'leonberger', 'miniature_pinscher', 'newfoundland', 'pomeranian', 'pug', 'saint_bernard', 'samoyed', 'scottish_terrier', 'shiba_inu', 'staffordshire_bull_terrier', 'wheaten_terrier', 'yorkshire_terrier'

・path = untar_data(URLs.PETS); pathを実行したときに、ダウンロードが開始されたが、最後に表示されるメッセージに違いが生じ、path.ls()を実行すると、['images', 'annotations']と表示されるべきところ、[WindowsPath('C:/Users/sasak/.fastai/data/oxford-iiit-pet/annotations'),
WindowsPath('C:/Users/sasak/.fastai/data/oxford-iiit-pet/images')]と表示された。

・大丈夫かなと心配になったが、次のセル以降、ビデオレクチャー通りのコードで、同様に動いている。

・ learn = ConvLearner(data, models.resnet34, metrics=error_rate)を実行すると、エラーが生じた。NameError: name 'ConvLearner' is not definedとのこと。

・fastaiのHPで「ConvLearner」を検索すると、「 cnn_learner」しか出てこないので、これに書き換えたら、エラーなく、resnet34を読み込むことができた。

・learn.fit_one_cycle(4)を実行すると、学習結果が得られる。ビデオレクチャーでは1エポックが30秒だが、自分の環境では1分40秒程度かかり、error_rateは0.061に対して0.070であった。これは、主としてGPUの違いによるものだと思う。

*resnet34をresnet50にしてみたら、GPUモリー不足で停止した。   RuntimeError: CUDA out of memory.

・Lesson 1の最後のほうで、resnet50、画像サイズを224から299に増やし、バッチサイズも増やすことによって、error_rateは0.061から0,044まで小さくなることが示されている。そこでの指摘は、GPUのメモリーが少ないとエラーになり、11GB以上必要とのことである。RTX 2080Tiが必要ですね。

・学習済みのモデルを使うとき、通常、パラメータを凍結するが、凍結しないで、入力側から出力側にかけて学習率を、例えば1e-6から1e-4に変化させる、というような手法が紹介されている。(正しく理解できているかどうかわからない)

・fastaiがより少ない行数でより短時間に良い結果を出しているのは、fastaiを開発している人が、グランドマスターであり、数学が得意でありかつ、それらの能力が、DNNの世界において最適化されているからであろう。

 

*今日は、fastaiをAnaconda3にインストールし、自分のパソコンの計算環境で動くことを確認できた。

・予測結果の評価と、種々のフォーマットのデータの読み込み方法等も学ぼう。

・fastaiとpytorchとは比較するものではないかもしれないが、複雑さが違いすぎるように思う。fastaiのトレーニングビデオの中で、講師は、誰でも使えるように、かつ、計算速度が速くなる工夫をしているが、fastaiのコマンドが具体的にどのような処理をしているかを、折に触れて見ておくようにと話しながら、説明画面上でも、頻繁にfastaiのコマンドの具体的な演算式を表示して演算内容を説明している。これを聞き取って理解できるようになりたいものだ。

・一見簡単に見えるfastaiに傾きかけているが、お手本コードはpytorchなのだから、pytorchをちゃんと理解しないとだめだ!

 

*明日は、Pytorchに戻って、ビギナーコースの画像分類のコードに親しもう。

<指の運動>

import torch

import torchvision

import torchvision.transforms as transforms

transform = transforms.Compose(

      [transforms.ToTensor(),

       transforms.Normalize*1])

trainset = torchvision.datasets.CIFAR10(root=' ./data', train=True,

                                                                 dounload=Trtue, transform=transform)

trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,

                                                                 shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root=' ./data', train=False,

                                                               download=True, transform=transform)

testloader = torch.utils.data.DataLoader(testset, batch_size=4,

                                                                shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'flog', 'horse', 'ship', 'truck') 

import matplotlib.pyplot as plt

import numpy as np

# functions to show an image

def imshow(img):

      img = img / 2 + 0.5     # unnormalize

      npimg = img.numpy()

      plt.imshow(np.transpose(npimg, (1, 2, 0)))

# get some random images

dataiter = iter(trainloader)

images, lables = dataiter.next()

# show images

imshow(torchvision.utils.make_grid(images))

# print lables

print(' ', join(' %5s' % classes[labels[j]] for j in range(4)))

 

import torch.nn as nn

import torch.nn.functional as F

 

class Net(nn.Module):

      def __init__(self):

          super(Net, self).__init__()

          self.conv1 = nn.Conv2d(3, 6, 5)

          self.pool = nn.MaxPool2d(2, 2)

          self.conv2 = nn.Conv2d(6, 16, 5)

          self.fc1 = nn.Linear(16 * 5 * 5, 120)

          self.fc2 = nn.Linear(120, 84)

          self.fc3 = nn.Linear(84, 10)

     

def forward(self, x):

          x = self.pool(F.relu(self.conv1(x)))

          x = self.pool(F.relu(self.conv2(x)))

          x = x.view(-1, 16 * 5 * 5)

          x = F.relu(self.fc1(x))

          x = F.relu(self.fc2(x))

          x = self.fc3(x)

          return x

 

net = Net()

 

criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(net.parameters(). lr=0.001, momentum=0.9)

 

for epoch in range(2):

      running_loss = 0.0

      for i, data in enumerate(trainloader, 0):

          # get the inputs

          inputs, labels = data

          # zero the parameter gradients

          optimizer.zero_grad()

          # forward + backward + optimize

          outputs = net(inputs)

          loss = criterion(outputs, labels)

          loss.backward()

          optimizer.step()

          # print statistics

          running_loss += loss.item()

          if i % 2000 == 1999:     # print every 2000 mini-batches

              print('[%d, %5d] loss: %.3f' %

                      (epoch + 1, i + 1, running_loss / 2000))

              running_loss = 0.0

print('Finished Training')

 

dataiter = iter(testloader)

images, lables = dataiter.next()

# print images

imshow(torchvision.utils.make_grid(images))

print('GroundTruth: ', ' ' .join(' %5s' % classes[lables[j]] for j in range(4)))

outputs = net(images)

_, predicted = torch.max(outputs, 1)

print('Predicted: ' , ' ' .join(' %5s' % classes[predicted[j]] for j in range(4)))

correct = 0

total = 0

with torch.no_grad():

      for data in testloader:

          images, lables = data

          outputs = net(images)

          _, predicted = torch.max(outputs.data, 1)

          total += labels.size(0)

          correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (

      100 * correct / totall))

まだあるけど、疲れたので、ここまで。

 

つづく 

 

f:id:AI_ML_DL:20200112084309p:plain

style 073

f:id:AI_ML_DL:20200112084343p:plain

DeepDream

 

*1:0.5, 0.5, 0.5), (0.5, 0.5, 0.5