Ma kēia ʻatikala, e haʻi wau iā ʻoe pehea e hoʻonohonoho ai i kahi kaiapuni aʻo mīkini i loko o 30 mau minuke, e hana i kahi neural network no ka ʻike kiʻi, a laila holo i ka pūnaewele like ma kahi kaʻina hana kiʻi (GPU).
ʻO ka mea mua, e wehewehe i ke ʻano o ka neural network.
I kā mākou hihia, he kŘkohu makemakika kēia, a me kāna lako polokalamu a i ʻole ke ʻano ʻenehana, i kūkulu ʻia ma ke kumu o ka hoʻonohonoho ʻana a me ka hana ʻana o nā neural network biological - nā ʻupena o nā pūnana nerve o kahi mea ola. Ua ala mai kēia manaʻo i ka wā e aʻo ana i nā kaʻina hana i loko o ka lolo a hoʻāʻo e hoʻohālike i kēia mau kaʻina hana.
ʻAʻole hoʻolālā ʻia nā neural network ma ke ʻano maʻamau o ka huaʻōlelo, ua aʻo ʻia lākou. ʻO ka hiki ke aʻo ʻo ia kekahi o nā pono nui o nā neural network ma mua o nā algorithm kuʻuna. ʻO ka ʻenehana, ʻo ke aʻo ʻana ka loaʻa ʻana o nā coefficients o nā pilina ma waena o nā neurons. I ka wā o ka hoʻomaʻamaʻa ʻana, hiki i ka neural network ke ʻike i nā hilinaʻi paʻakikī ma waena o ka ʻikepili hoʻokomo a me ka ʻikepili hoʻopuka, a me ka hoʻokō generalization.
Mai ka manaʻo o ke aʻo ʻana i ka mīkini, ʻo kahi neural network kahi hihia kūikawā o nā ʻano hana ʻike kumu, ka nānā ʻana i ka discriminant, nā ʻano clustering a me nā ʻano hana ʻē aʻe.
Kākoʻo
ʻO ka mua, e nānā kākou i nā mea hana. Pono mākou i kahi kikowaena me ka ʻōnaehana hana Linux i kau ʻia ma luna. ʻO nā mea hana e pono ai no ka hoʻohana ʻana i nā ʻōnaehana aʻo mīkini he ikaika loa a, ʻo ka hopena, he kumukūʻai. No ka poʻe i loaʻa ʻole kahi mīkini maikaʻi ma ka lima, paipai wau e hoʻolohe i nā hāʻawi o nā mea hāʻawi kapua. Hiki iā ʻoe ke hoʻolimalima koke i ke kikowaena i koi ʻia a uku wale no ka manawa hoʻohana.
Ma nā papahana kahi e pono ai ke hana i nā pūnaewele neural, hoʻohana wau i nā kikowaena o kekahi o nā mea hoʻolako kapua Lūkini. Hāʻawi ka hui i nā kikowaena kapua no ka hoʻolimalima kikoʻī no ka aʻo ʻana i ka mīkini me nā mea hana kiʻi kiʻi Tesla V100 ikaika (GPU) mai NVIDIA. I ka pōkole: ʻo ka hoʻohana ʻana i kahi kikowaena me kahi GPU hiki ke lilo i ʻumi mau manawa ʻoi aku ka maikaʻi (wikiwiki) i hoʻohālikelike ʻia me kahi kikowaena o nā kumukūʻai like e hoʻohana ana i kahi CPU (ke kikowaena kikowaena kaulana kaulana) no ka helu ʻana. Loaʻa kēia ma muli o nā hiʻohiʻona o ka hoʻolālā GPU, e hoʻokō wikiwiki ana i nā helu helu.
No ka hoʻokō ʻana i nā hiʻohiʻona i hōʻike ʻia ma lalo nei, ua kūʻai mākou i kēia kikowaena no kekahi mau lā:
- SSD disk 150 GB
- RAM 32 GB
- Tesla V100 16 Gb kaʻina hana me 4 cores
Ua hoʻokomo mākou i ka Ubuntu 18.04 ma kā mākou mīkini.
Hoʻonohonoho i ke kaiapuni
I kēia manawa e hoʻokomo kāua i nā mea āpau e pono ai no ka hana ma ke kikowaena. No ka mea ʻo kā mākou ʻatikala no ka poʻe hoʻomaka, e kamaʻilio wau e pili ana i kekahi mau mea e pono ai lākou.
Hana ʻia ka nui o ka hana i ka wā e hoʻonohonoho ai i kahi kaiapuni ma o ka laina kauoha. Hoʻohana ka hapa nui o nā mea hoʻohana iā Windows i kā lākou OS hana. ʻO ka console maʻamau i kēia OS e waiho nui i ka makemake. No laila, e hoʻohana mākou i kahi mea hana maʻalahi
ssh root@server-ip-or-hostname
Ma kahi o ka server-ip-or-hostname, e kuhikuhi i ka IP address a i ʻole ka inoa DNS o kāu kikowaena. A laila, e hoʻokomo i ka ʻōlelo huna a inā kūleʻa ka pilina, pono mākou e loaʻa i kahi leka e like me kēia.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)
ʻO ka ʻōlelo nui no ka hoʻomohala ʻana i nā hiʻohiʻona ML ʻo Python. A ʻo ke kahua kaulana loa no kona hoʻohana ʻana ma Linux ʻo ia
E hoʻokomo iā ia ma kā mākou kikowaena.
Hoʻomaka mākou ma ka hoʻonui ʻana i ka luna pūʻolo kūloko:
sudo apt-get update
E hoʻouka i ka curl (mea hoʻohana laina kauoha):
sudo apt-get install curl
Hoʻoiho i ka mana hou o Anaconda Distribution:
cd /tmp
curl –O https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
E hoʻomaka kākou i ke kau ʻana:
bash Anaconda3-2019.10-Linux-x86_64.sh
I ka wā o ke kaʻina hana, e noi ʻia ʻoe e hōʻoia i ka ʻaelike laikini. Ma hope o ka hoʻokomo pono ʻana, pono ʻoe e ʻike i kēia:
Thank you for installing Anaconda3!
Ua hana ʻia nā ʻōhua he nui no ka hoʻomohala ʻana i nā hiʻohiʻona ML; hana mākou me nā mea kaulana loa:
ʻO ka hoʻohana ʻana i ka framework hiki iā ʻoe ke hoʻonui i ka wikiwiki o ka hoʻomohala ʻana a hoʻohana i nā mea hana i mākaukau no nā hana maʻamau.
Ma kēia hiʻohiʻona e hana mākou me PyTorch. E hoʻouka kākou:
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
I kēia manawa pono mākou e hoʻolauna iā Jupyter Notebook, kahi mea hana hoʻomohala kaulana no nā loea ML. Hiki iā ʻoe ke kākau i ke code a ʻike koke i nā hopena o kāna hoʻokō. Hoʻokomo ʻia ʻo Jupyter Notebook me Anaconda a ua kau ʻia ma kā mākou kikowaena. Pono ʻoe e hoʻopili iā ia mai kā mākou ʻōnaehana desktop.
No ka hana ʻana i kēia, e hoʻomaka mua mākou iā Jupyter ma ke kikowaena e kuhikuhi ana i ke awa 8080:
jupyter notebook --no-browser --port=8080 --allow-root
A laila, e wehe ana i kahi ʻaoʻao ʻē aʻe i kā mākou Cmder console (luna papa - New console dialog) e hoʻopili mākou ma o ke awa 8080 i ke kikowaena ma o SSH:
ssh -L 8080:localhost:8080 root@server-ip-or-hostname
Ke komo mākou i ke kauoha mua, e hāʻawi ʻia mākou i nā loulou e wehe iā Jupyter i kā mākou polokalamu kele pūnaewele:
To access the notebook, open this file in a browser:
file:///root/.local/share/jupyter/runtime/nbserver-18788-open.html
Or copy and paste one of these URLs:
http://localhost:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311
or http://127.0.0.1:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311
E hoʻohana kākou i ka loulou no localhost:8080. E kope i ke ala holoʻokoʻa a hoʻopili iā ia i loko o ka pahu helu o ka polokalamu kele pūnaewele o kāu PC. E wehe ana ʻo Jupyter Notebook.
E hana kākou i puke puke hou: New - Notebook - Python 3.
E nānā kākou i ka hana kūpono o nā ʻāpana a pau a mākou i hoʻokomo ai. E hoʻokomo i ka code PyTorch code i Jupyter a holo i ka hoʻokō (Run button):
from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)
Pono ka hopena e like me kēia:
Inā he hopena like kāu, a laila ua hoʻonohonoho pono mākou i nā mea āpau a hiki iā mākou ke hoʻomaka i ka hoʻomohala ʻana i kahi neural network!
Ke hana ʻana i kahi pūnaewele neural
E hana mākou i kahi pūnaewele neural no ka ʻike kiʻi. E lawe kākou i kēia i kumu
E hoʻohana mākou i ka ʻikepili CIFAR10 i loaʻa i ka lehulehu e aʻo i ka pūnaewele. Loaʻa iā ia nā papa: "mokulele", "kaʻa", "manu", "pōkole", "dia", "ʻīlio", "frog", "lio", "moku", "truck". ʻO nā kiʻi ma CIFAR10 he 3x32x32, ʻo ia hoʻi, nā kiʻi kala 3-channel o 32x32 pixels.
No ka hana, e hoʻohana mākou i ka pōʻai i hana ʻia e PyTorch no ka hana ʻana me nā kiʻi - torchvision.
E hana mākou i kēia mau ʻanuʻu i ka hoʻonohonoho:
- Hoʻouka a hoʻomaʻamaʻa i ka hoʻomaʻamaʻa ʻana a me ka hoʻāʻo ʻana i nā pūʻulu ʻikepili
- Wehewehe Neural Network
- Hoʻomaʻamaʻa pūnaewele ma ka ʻikepili aʻo
- ʻO ka hoʻāʻo ʻana i ka ʻike pūnaewele
- E hana hou i ka hoʻomaʻamaʻa a me ka hoʻāʻo ʻana me ka GPU
E hoʻokō mākou i nā code āpau ma lalo nei ma Jupyter Notebook.
Hoʻouka a maʻamau CIFAR10
E kope a holo i kēia code ma Jupyter:
import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, 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', 'frog', 'horse', 'ship', 'truck')
Pono ka pane:
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified
E hōʻike i kekahi mau kiʻi hoʻomaʻamaʻa no ka hoʻāʻo ʻana:
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)))
plt.show()
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
Wehewehe Neural Network
E noʻonoʻo mua kākou i ka hana ʻana o kahi pūnaewele neural no ka ʻike kiʻi. ʻO kēia kahi pūnaewele kiko-i-point maʻalahi. Lawe ʻo ia i ka ʻikepili hoʻokomo, hoʻohele iā ia i kekahi mau papa i kēlā me kēia, a laila hoʻopuka i ka ʻikepili puka.
E hana mākou i kahi pūnaewele like i ko mākou kaiapuni:
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()
Hoʻomaopopo pū mākou i kahi hana poho a me kahi mea hoʻoponopono
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Hoʻomaʻamaʻa pūnaewele ma ka ʻikepili aʻo
E hoʻomaka kākou e aʻo i kā mākou pūnaewele neural. E ʻoluʻolu, ma hope o kou holo ʻana i kēia code, pono ʻoe e kali a hiki i ka pau ʻana o ka hana. He 5 mau minuke. Pono ka manawa e aʻo ai i ka pūnaewele.
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
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')
Loaʻa iā mākou ka hopena aʻe:
Mālama mākou i kā mākou kumu hoʻohālike i aʻo ʻia:
PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)
ʻO ka hoʻāʻo ʻana i ka ʻike pūnaewele
Hoʻomaʻamaʻa mākou i ka pūnaewele me ka hoʻohana ʻana i kahi ʻikepili hoʻomaʻamaʻa. Akā pono mākou e nānā inā ua aʻo ʻia ka pūnaewele i kekahi mea.
E hoʻāʻo mākou i kēia ma ka wānana ʻana i ka lepili papa i hoʻopuka ʻia e ka neural network a hoʻāʻo iā ia e ʻike inā he ʻoiaʻiʻo. Inā pololei ka wānana, hoʻohui mākou i ka hāpana i ka papa inoa o nā wānana pololei.
E hōʻike mākou i kahi kiʻi mai ka hoʻonohonoho hoʻāʻo:
dataiter = iter(testloader)
images, labels = dataiter.next()
# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
I kēia manawa e nīnau mākou i ka neural network e haʻi iā mākou i nā mea i loko o kēia mau kiʻi:
net = Net()
net.load_state_dict(torch.load(PATH))
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
for j in range(4)))
ʻIke maikaʻi nā hopena: ʻike pololei ka pūnaewele i ʻekolu o nā kiʻi ʻehā.
E ʻike kākou i ka hana ʻana o ka ʻupena ma ka ʻikepili holoʻokoʻa.
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = 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 / total))
Me he mea lā ua ʻike ka pūnaewele i kekahi mea a ke hana nei. Inā hoʻoholo ʻo ia i nā papa ma ke koho ʻole, ʻo 10% ka pololei.
E ʻike kākou i nā papa i ʻike maikaʻi ʻia e ka pūnaewele:
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print('Accuracy of %5s : %2d %%' % (
classes[i], 100 * class_correct[i] / class_total[i]))
Me he mea lā ʻoi aku ka maikaʻi o ka pūnaewele i ka ʻike ʻana i nā kaʻa a me nā moku: 71% pololei.
No laila ke hana nei ka pūnaewele. I kēia manawa, e ho'āʻo kākou e hoʻololi i kāna hana i ke kaʻina hana kiʻi (GPU) a ʻike i nā loli.
Hoʻomaʻamaʻa i kahi pūnaewele neural ma GPU
ʻO ka mea mua, e wehewehe pōkole wau i ke ʻano o CUDA. ʻO ka CUDA (Compute Unified Device Architecture) he kahua hoʻolikelike like i hoʻomohala ʻia e NVIDIA no ka hoʻopili helu maʻamau ma nā ʻāpana hana kiʻi (GPU). Me CUDA, hiki i nā mea hoʻomohala ke hoʻolalelale i nā noi computing ma o ka hoʻohana ʻana i ka mana o GPU. Ua kau ʻia kēia kahua ma kā mākou kikowaena a mākou i kūʻai ai.
E wehewehe mua i kā mākou GPU ma ke ʻano he mea cuda mua i ʻike ʻia.
device = torch . device ( "cuda:0" if torch . cuda . is_available () else "cpu" )
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print ( device )
Hoʻouna i ka pūnaewele i ka GPU:
net.to(device)
Pono mākou e hoʻouna i nā mea hoʻokomo a me nā pahuhopu i kēlā me kēia pae i ka GPU:
inputs, labels = data[0].to(device), data[1].to(device)
E aʻo hou kākou i ka pūnaewele ma ka GPU:
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data[0].to(device), data[1].to(device)
# 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')
I kēia manawa, ua lōʻihi ka hoʻomaʻamaʻa pūnaewele ma kahi o 3 mau minuke. E hoʻomanaʻo mākou i ka manawa like ma kahi kaʻina hana maʻamau he 5 mau minuke. ʻAʻole koʻikoʻi ka ʻokoʻa, hana kēia no ka mea ʻaʻole nui loa kā mākou pūnaewele. Ke hoʻohana nei i nā papa hana nui no ka hoʻomaʻamaʻa ʻana, e hoʻonui ka ʻokoʻa ma waena o ka wikiwiki o ka GPU a me kahi kaʻina hana kuʻuna.
Me he mea lā ʻo ia wale nō. ʻO ka mea i hiki iā mākou ke hana:
- Ua nānā mākou i ke ʻano o ka GPU a koho i ke kikowaena kahi i kau ʻia ai;
- Ua hoʻonohonoho mākou i kahi polokalamu polokalamu e hana i kahi pūnaewele neural;
- Ua hana mākou i kahi pūnaewele neural no ka ʻike kiʻi a hoʻomaʻamaʻa iā ia;
- Ua hana hou mākou i ka hoʻomaʻamaʻa pūnaewele me ka hoʻohana ʻana i ka GPU a loaʻa ka piʻi o ka wikiwiki.
E hauʻoli wau e pane i nā nīnau ma nā manaʻo.
Source: www.habr.com