Sieci neuronowe - czym i jak - najlepiej Python

0

Zbliżają się Święta i kilka dni wolnego, wypada więc poświęcić kilka godzin na swoje hobby. Mnie od pewnego czasu męczą sieci neuronowe mam już opracowaną całą koncepcję i algorytmy, jednak zwyczajnie nie wiem w czym to napisać. Moje "natywne" języki to PHP i Delphi ... PHP z założenia się do tego nie nadaje a w Delphi to już tylko dinozaury i ja piszą zresztą chcę się od niego kiedyś odciąć. C++ nie cierpię i mam na nie alergię z wysypką włącznie.
Przeglądając internet w tematyce sieci neuronowych spotkałem dużo publikacji z przykładami niestety w C++ ale także w Python'ie.
Pythona choć nie znam to postanowiłam go wstępnie "pooglądać" napisać kilka "hello world" i czuję, że zdecydowanie będzie mi bliższy niż C++.

Zatem do rzeczy.

Szukam biblioteki dla Pythona, która pomoże mi ogarnąć przeliczanie sieci neuronowej, zmiennoprzecinkowej pozostałe parametry to ( pi * drzwi ale może coś ułatwi ):

  • 1000 wejść.
  • 2 do 4 warstw ukrytych każda po 1200 - 2000 neuronów.
  • 1000 wyjść.

Takich sieci (każdej skonfigurowanej nieco inaczej ) w pamięci jednocześnie chciałbym trzymać 50 - 500.

Nie chcę tego samemu pisać bo jakoś głęboko czuję, że podczas przeliczania takich sieci można sporo zoptymalizować bardzo dużo
zyskując na wydajności ( nie będę kola na nowo wymyślał ) a na niej zależy mi najbardziej bo zaplanowany proces uczenia z założenia jest czasochłonny i robi mi sporą różnicę, czy zapuszczę algorytmy na 3 dni zamiast 30 na własnym algorytmie.

3

Zdecydowanie tensorflow, albo jeszcze łatwiej nakładka: keras.
https://www.tensorflow.org/
https://keras.io/

0
lion137 napisał(a):

Zdecydowanie tensorflow, albo jeszcze łatwiej nakładka: keras.
https://www.tensorflow.org/
https://keras.io/

Wielkie dzięki. Jakieś doświadczenie kolega w tym ma ?
Czy dobrze wnioskuję z pierwszych opisów, że te biblioteki potrafią wykorzystać sprzętowe akceleratory AI jeśli takowy mam na karcie graficznej ?
Jeśli tak to zdecydowanie przerasta to moje oczekiwania i jestem w siódmym niebie :-)

1

Bardzo przyjemnie się w tym sieci zapuszcza; co do sprzętu, to Musisz mieć odpowiednia kartę, najlepiej od nvidii, wszystko Znajdziesz na necie.

0

Ech i już pierwsze kłody po d nogi. Mam zainstalowanego Pythona 3.8.1. Na głównej stronie Keras piszą, że są kompatybilni z 2.7 - 3.6. Czy instalacja w połączeniu z 3.8 może zwiastować jakieś poważne kłopoty czy też co najwyżej drobne problemy, których rozwiązania należy się spodziewać wkrótce ?
Jakiegoś zatrzęsienia postów o problemach nie widzę dlatego pytam czy to po prostu efekt tego że Python 3.8 dosłownie kilka dni temu się podniósł w wersji czy to grubsza sprawa?

1

Lepiej Zrób jak piszą.

1

Dont go into tensorflow api jest niestabilne i czym dalej w las tym gorzej ze zrobieniem czegokolwiek (nawet ludzie z googla piszą w pytorchu [a tensorflow jest budowany przez google :D])
https://pytorch.org/
Co do wersji pythona przewaznie to jest ~3 miesiace zanim biblioteki deep learningowe updatuja sie do nowej wersji pythona.

1

Nieprawda, pisze Ci, że to jego pierwszy framework i nowy język; będzie mu dużo łatwiej zakodować taką sieć, jaką opisał w kerasie czy tensorflow. Tensorflow jest prostszy i sprawdzony - na produkcji od paru lat.

1
lion137 napisał(a):

Nieprawda, pisze Ci, że to jego pierwszy framework i nowy język; będzie mu dużo łatwiej zakodować taką sieć, jaką opisał w kerasie czy tensorflow. Tensorflow jest prostszy i sprawdzony - na produkcji od paru lat.

Tensorflow jest duzo trudniejszy niz pytorch (po pierwsze statyczny graf i brak mozliwosci debugowania po 2 duzo bardziej skomplikowane api nie mowiac o bugach w tf 2.0). Pisze to z perspektywy osoby ktora pisala w tensorflow przez 2 lata komercyjnie :)

0

Panowie spokojnie obu bardzo dziękuję i zapewne spróbuję jedno i drugie.

Na chwilę obecną pojawił się jednak inny o wiele bardziej prozaiczny problem.
Nie wiem dlaczego byłem przekonany, że Python standardowo kompiluje się do kodu maszynowego jak C++, Delphi i itp...
Tymczasem albo jeszcze czegoś nie wiem albo tak nie jest. Program, który chcę napisać w ogromniej mierze będzie wykonywał dużo obliczeń na sporych tablicach ( analiza sygnałów analogowych / akustycznych ) jakieś dodawania, mnożenia dzielenia masa pętel w pętli, przeliczanie macierzy itp.
Wstępnie zaimplementowałem sobie quickSort żeby zobaczyć jak taki Python sobie z tym radzi i wygląda jakby on ten kod jedynie interpretował ...

Wynik sortowania tablicy 1 000 000 elementów w Python to prawie 4 sekundy.
Tymczasem w Delphi zajmuje to 94us ( 1/10 sek ) ...
To 400 razy wolniej ...

Python:

import random
import time
import array

def partition(arr,low,high): 
    i = ( low-1 )
    pivot = arr[high]
  
    for j in range(low , high): 
        if   arr[j] <= pivot: 
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 
  
    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return ( i+1 ) 
  
def quickSort(arr,low,high): 
    if low < high: 
        pi = partition(arr,low,high) 
        quickSort(arr, low, pi-1) 
        quickSort(arr, pi+1, high) 


####################################################################################################
# MAIN
#

arr = [] 

for i in xrange(1000000): 
    arr.append ( random.random()*1000 )

n = len(arr)


millisStart = int(round(time.time() * 1000))
quickSort(arr,0,n-1) 
millisEnd = int(round(time.time() * 1000))

milisDiff = millisEnd - millisStart

print ("Sorted array is: %f" % milisDiff) 

Delphi:

program qSort;
{$apptype console}
uses
  System.SysUtils, Windows;
var
 tab : Array [ 0..999999 ] of integer ;
 i : integer ;
 s: string ;
 Start, Stop, Diff: cardinal;

procedure Sort(var iArray: array of Integer);

  procedure QuickSort(iLow, iHigh : Integer;
  var
    iLo, iHi : Integer;
    x, Temp : Integer;
  begin
    iLo := iLow;
    iHi := iHigh;

    X := iArray[(iLow + iHigh) div 2];
    repeat
      while iArray[iLo] < X do Inc(iLo);
      while iArray[iHi] > X do Dec(iHi);
      if (iLo <= iHi) then
      begin
        Temp := iArray[iLo];
        iArray[iLo] := iArray[iHi];
        iArray[iHi] := Temp;
        Inc(iLo);
        Dec(iHi);
      end;
    until iLo > iHi;
    if (iHi > iLow) then QuickSort(iLow, iHi);
    if (iLo < iHigh) then QuickSort(iLo, iHigh);
  end;

begin
  QuickSort(Low(iArray), High(iArray));
end;

begin

  for i:=0 to 999999 do
    begin
      tab [ i ] := random( 1000 );
    end;

  start := GetTickCount;
  Sort ( tab );
  Stop := GetTickCount;
  Diff := Stop - Start ;

  WriteLn ('Time econds: ' +IntToStr(round(Diff/MSecsPerSec * 1000)));
  readln( s );

end.
1
katakrowa napisał(a):

Panowie spokojnie obu bardzo dziękuję i zapewne spróbuję jedno i drugie.

Na chwilę obecną pojawił się jednak inny o wiele bardziej prozaiczny problem.
Nie wiem dlaczego byłem przekonany, że Python standardowo kompiluje się do kodu maszynowego jak C++, Delphi i itp...
Tymczasem albo jeszcze czegoś nie wiem albo tak nie jest. Program, który chcę napisać w ogromniej mierze będzie wykonywał dużo obliczeń na sporych tablicach ( analiza sygnałów analogowych / akustycznych ) jakieś dodawania, mnożenia dzielenia masa pętel w pętli, przeliczanie macierzy itp.
Wstępnie zaimplementowałem sobie quickSort żeby zobaczyć jak taki Python sobie z tym radzi i wygląda jakby on ten kod jedynie interpretował ...

Wynik sortowania tablicy 1 000 000 elementów w Python to prawie 4 sekundy.
Tymczasem w Delphi zajmuje to 94us ( 1/10 sek ) ...
To 400 razy wolniej ...

Do dzialan na tablicach -> https://numpy.org/
Jak chcesz czystego "pythona" to wtedy numba -> http://numba.pydata.org/

0

@katakrowa: Gdzie Ci pisałem, żeby to robić w Pythonie?:) Oczywiście, że czysty Python/CPython jest wolny - jest dynamiczny i, co prawda kompilowalny, ale do bytecodu bez JIT - a. Python jest tu tylko interfejsem, Masz pisać w kerasie, tensorflow, albo pytorch (chociaż tu w opozycji do kolegi uważam, że na początek keras + tensorflow jest lepszy, to nie tylko moje zdanie). Czyli, żadnych konstrukcji Pythona, pętli, itp. Jak Chcesz coś,np., posortować to: https://www.tensorflow.org/api_docs/python/tf/sort . Sieci też nie Piszesz, jak dokumentacja frameworka podaje, Ustalasz liczbę warstw, ilośc neuronów, metrykę do optymalizacji i inne parametry/hiperparametry, Zapuszczasz model i wtedy dopiero jest odpalany zoptymalizowany, zrównoleglony kod C/C++, na GPU/CPU.

0
lion137 napisał(a):

@katakrowa: Gdzie Ci pisałem, żeby to robić w Pythonie?:) Oczywiście, że czysty Python/CPython jest wolny - jest dynamiczny i, co prawda kompilowalny, ale do bytecodu bez JIT - a. Python jest tu tylko interfejsem, Masz pisać w kerasie, tensorflow, albo pytorch (chociaż tu w opozycji do kolegi uważam, że na początek keras + tensorflow jest lepszy, to nie tylko moje zdanie). Czyli, żadnych konstrukcji Pythona, pętli, itp. Jak Chcesz coś,np., posortować to: https://www.tensorflow.org/api_docs/python/tf/sort . Sieci też nie Piszesz, jak dokumentacja frameworka podaje, Ustalasz liczbę warstw, ilośc neuronów, metrykę do optymalizacji i inne parametry/hiperparametry, Zapuszczasz model i wtedy dopiero jest odpalany zoptymalizowany, zrównoleglony kod C/C++, na GPU/CPU.

Nie mam pretensji i całkowicie rozumiem konsekwencje metodologi pracy na języku interpretowanym. Po prostu trzeba będzie wszystko inaczej w głowie poukładać bo nie wiedziałem, że Python się nie kompiluje (naprawdę było to dla mnie dzisiaj zaskoczenie).
Teraz część przygotowującą dane będę pisał w Delphi a przeliczanie sieci będę pisał w Pythonie i tyle. Trzeba będzie jednak kilka dni posiedzieć nad jakąś sensowną metodą wymiany danych między nimi i po sprawie. Jak pisałem na początku nie widzę sensu samodzielnego implementowania sieci a narzędzia, które zaproponowaliście wyglądają bardzo profesjonalnie i bezdyskusyjnie ich użycie ma sens.

0

Jeśli chcesz używać karty graficznej do treningu sieci neuronowej nie musisz mieć karty nVidii. Za pomocą biblioteki PlaidML możesz podpiąć cokolwiek. Bilioteka działa, sam jej używałem w pracy magisterskiej. Bardzo polceam, licencja Apache 2.0 ;)

Osobiście wolę Keras :)

https://github.com/plaidml/plaidml

1 użytkowników online, w tym zalogowanych: 0, gości: 1