"рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?" рдХреБрдмрдбрд╝рд╛ рдиреЗ рдореБрдбрд╝рдХрд░ рдкреВрдЫрд╛ред
"рдПрд▓реНрдбрди -3," рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдХрд╣рд╛ред
"рдПрдХ рд╕рдореГрджреНрдз рдХрд╛рд░," рдореИрдВрдиреЗ рдХрд╣рд╛ред "[1]
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдЧрд╣рди рдЕрдзреНрдпрдпрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ CUDA рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдб рджрд┐рдпрд╛ рдФрд░ рдмреЙрд╕ рдиреЗ рдЗрдЪреНрдЫрд╛ рд╡реНрдпрдХреНрдд рдХреА рдХрд┐ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд╛ рдпрд╣ рд╢рд┐рдЦрд░ рд╣рдорд╛рд░реА рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХреЛ рдЖрдЧреЗ рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдирд┐рдХрд▓рдиреЗ рджреЗрдЧрд╛ред рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдиреНрд╕рд░ рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдореИрдВрдиреЗ рдЯреЙрд░реНрдЪ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрдХрд░реНрд╖рдХ рдерд╛ рдХрд┐ рдпрд╣ рд▓реБрдЖ рдФрд░ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдПрдлрдПрдлрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред рдФрд░ рдореБрдЭреЗ рдкрд╛рдпрдерди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рд╣рдмрд░рд╛рдмреНрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛, рдЬрд┐рд╕рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореЗрд░реА рд░рд╛рддреНрд░рд┐рд╕реНрддрдВрдн рдореЗрдВ рдореИрдВ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ, рдореЙрдбрд▓ рдмреА + рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рдорд╢рд╛рд▓ рдЙрдард╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдмрд╣реБрдд рд╕рд░рд▓ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред
GPU alexnet . Torch. , , .
(Raspberry PI B+).
torch :
apt-get install git-core
git clone https://github.com/torch/distro.git ~/torch --recursive
, Torch OpenBLAS QT , :
apt-get install -y build-essential gcc g++ curl cmake libreadline-dev libjpeg-dev libpng-dev ncurses-dev imagemagick libzmq3-dev gfortran libopenblas-base libopenblas-dev
torch:
cd ~/torch;
./install.sh
.
тАФ ? тАФ . [1]
: torch: arm, NEON:
[ 6%] Building C object lib/TH/CMakeFiles/TH.dir/THVector.c.o
In file included from /home/pi/torch/pkg/torch/lib/TH/THVector.c:2:0:
/home/pi/torch/pkg/torch/lib/TH/generic/THVectorDispatch.c: In function тАШTHByteVector_vectorDispatchInitтАЩ:
/home/pi/torch/pkg/torch/lib/TH/generic/simd/simd.h:64:3: error: impossible constraint in тАШasmтАЩ
asm volatile ( "cpuid\n\t"
. , ! , - torch Raspberry PI -B ( NEON): https://github.com/vfonov/deep-pi/releases/download/v1/torch_intstall_raspbian_arm6l_20161218.tar.gz, /home/pi
MNIST, Torch:
th train-on-mnist.lua
<torch> set nb of threads to 4
<mnist> using model:
nn.Sequential {
[input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> output]
(1): nn.SpatialConvolutionMM(1 -> 32, 5x5)
(2): nn.Tanh
(3): nn.SpatialMaxPooling(3x3, 3,3, 1,1)
(4): nn.SpatialConvolutionMM(32 -> 64, 5x5)
(5): nn.Tanh
(6): nn.SpatialMaxPooling(2x2, 2,2)
(7): nn.Reshape(576)
(8): nn.Linear(576 -> 200)
(9): nn.Tanh
(10): nn.Linear(200 -> 10)
}
<warning> only using 2000 samples to train quickly (use flag -full to use 60000 samples)
<mnist> loading only 2000 examples
<mnist> done
<mnist> loading only 1000 examples
<mnist> done
<trainer> on training set:
<trainer> online epoch
[===================>.................... 471/2000 ....................................] ETA: 2m20s | Step: 92ms
, тАФ i5-4590 CPU @ 3.30GHz, GPU:
[=======================>................ 571/2000 ....................................] ETA: 27s613ms | Step: 19ms
. 5 .
┬л┬╗ : ┬л. ┬╗ [1]
googlenet. : Alexnet , . squeezenet Network-in-Network, torch.
ARM ( Raspberry PI тАФ ).
torch, тАШasciiтАЩ, тАФ :
Desktop:
model=torch.load(тАШblah.t7тАЩ)
torch.save(тАШblah_ascii.t7тАЩ,model,тАЩasciiтАЩ)
Raspberry PI:
model=torch.load(тАШblah_ascii.t7тАЩ,тАЩasciiтАЩ)
torch.save(тАШblah_arm.t7тАЩ,model)
arm .
:
.
...
local m=torch.load(prefix..'nin_bn_final_arm.t7')
...
local input=image.load(prefix.."n07579787_ILSVRC2012_val_00049211.JPEG")
...
local output=model:forward(cropped)
...
, ImageNET:
>th test_single.lua n07579787_ILSVRC2012_val_00049211.JPEG
loading model:0.57sec
Running neural net:13.46sec
25.3%: n07579787: plate
13.8%: n07873807: pizza, pizza pie
8.8%: n04263257: soup bowl
8.0%: n07590611: hot pot, hotpot
7.2%: n07831146: carbonara
T.e 14 !
: camera display, , 14 . (luarocks install camera) - (luarocks install display).
.
тАж
local cam = image.Camera {idx=0,width=iW,height=iH}
...
local frame = cam:forward()
local cropped = image.crop(frame, w1, h1, w1+oW, h1+oH)
тАж
display_sample_in.win=display.image(cropped,display_sample_in)
тАж
local output=model:forward(cropped)
тАж
display_output.win=display.text(out_text,display_output)
display: nohup th -ldisplay.start 8000 0.0.0.0 &
:

:



, . , - , , .
nnpack, .
:
"рд╕реЛрдорд╡рд╛рд░ рд╕реЗ рд╢рдирд┐рд╡рд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ" рдФрд░ рдП рдФрд░ рдмреА рд╕реНрдЯреНрд░реИрдЧрд╛рддреНрд╕реНрдХреА рджреНрд╡рд╛рд░рд╛ "рдж рдЯреЗрд▓ рдСрдлрд╝ рдж рдереНрд░реА" рдХреЗ рдЙрджреНрдзрд░рдгред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рд╕рднреА рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдЬреАрдердм рдкрд░ рд╣реИрдВ ред