Implemetanacja Pandas DataFrame Dataset w TorchText

Dziś techniczny wpis o tym, jak podawać dane do sieci w Pytorch przy pomocy Pandas DataFrame z wykorzystaniem biblioteki TorchText. W chwili pisania TorchText nie ma możliwości pobierania danych wprost z Pandas. Obsługuje szereg typów plików oraz gotowych zbiorów, ale zakładam, że większość z nas i tak na wstępnym etapie przetwarza dane przy pomocy Pandas.

Jeżeli nie znacie jeszcze TorchText to zapraszam do wpisu “Przetwarzasz teksty, robisz NLP, TorchText Ci pomoże!” . Omówiłem w nim idee pracy z TorchText oraz na własnych doświadczeniach opisałem w czym może ona pomóc.

Skąd TorchText pobiera dane

Biblioteka TrochText ma za zadanie pomagać w wczytywaniu i przetwarzaniu danych tekstowych (sekwencyjnych). Zapewnia szereg klas do wczytywania danych z różnych formatów. Klasą bazową służącą do wczytywania danych jest Dataset. Jednak najczęściej wykorzystywaną implementacją jest TabularDataset, która “Defines a Dataset of columns stored in CSV, TSV, or JSON format.” (cytując dokumentację).

W chwili pisania tego artykułu nie ma klasy, która pozwalałaby na wczytanie danych z Pandas DataFrame. A co w tym złego się zapytacie?

A to, że dla mnie ramka z danymi to pierwsze, w czym obrabiam dane. Daje szerokie możliwości wstępnej obróbki oraz wczytywanie z niej danych. Jest także wspierane przez wiele innych bibliotek. Stąd pojawiła się potrzeba, aby ramka była moim źródłem danych i stanowiła część całego procesu od wczytania po trening.

Tego problemu doświadczyli także inni, szybki research i trafiłem na przykładową prostą implementację z stack overflow (https://stackoverflow.com/questions/52602071/dataframe-as-datasource-in-torchtext).

Dataframe jako źródło danych do TorchTexh – implementacja

Implementacja jest dosyć prosta. Należy stworzyć dwie klasy. Pierwsza dziedziczącą po Dataset, a druga dziedzicząca po data.Example. Cała filozofia polega na przemapowaniu listy pól na nazwami kolumn z dataframe (Fields) na pola w klasie Example.

Jak się do tego zabrać? Na początku zdefiniujmy klasę DataFrameDataset.

Do konstruktora tej klasy przekazujemy dwa argumenty. Pandasową ramkę z danymi oraz słownik określający jak poszczególne kolumny z tej ramki mają być przetwarzane (Fields). Następnie w konstruktorze budujemy listę self.examples. Jest to lista przykładów, każdy przykład to jeden wiersz z naszego źródła danych.

Do budowania Example wykorzystamy własną pomocniczą klasę SeriesExample. Z przekazanej serii danych stworzy ona egzemplarze z ustawionymi polami o nazwach przekazanych w liście fields. Zwróćcie uwagę na metody setattr.

Przykład użycia DataframeDataset

Przykład użycia tej klasy, znajdziecie we wpisie tworzącym sieć LSTM do zliczania znaków. Tam bez wyjaśnienia użyłem tej klasy, gdzie wygenerowane dane trafiły do dataframe. Następnie na jego podstawie stworzyłem DataFrameDataset, dzięki czemu można go było użyć w TorchText.

W wielkim skrócie, aby użyć DataFrameDataset musicie wykonać:

Ładujemy nasze dane do ramki, w tym przykładzie powinniśmy mieć w ramce dwie kolumny “text” i “label”. Pierwsza zawierająca w każdym wierszu teksty, a druga etykietę przypisaną do danego tekstu.

Tworzymy dwa pola (Fields) a następnie do konstruktora klasy DataFrameDataset przekazujemy ramkę oraz słownik: “nazwa kolumny z ramki”: odpowiedni Field.

Dalej już możemy postępować standardowo jak przy normalnym użyciu TorchText.

Podsumowanie i materiały

We wpisie pokazałem, w jaki sposób wykorzystać ramkę z Pandas jako źródło danych do TorchText. Jest to wygodny skrót, który pomaga w ujednoliceniu całego procesu czyszczenia danych oraz ich wczytywania.
Z doświadczenia w naszych firmowych komercyjnych projektach mogę powiedzieć, że sprawdził się bardzo dobrze.

Można go jeszcze rozszerzyć o to, aby dane nie pochodziły z samej ramki a z Python’owego generatora. Spowoduje to, że nie będziecie musieli martwić się o wielkość danych i zasoby RAM’u przy gigantycznych zbiorach tekstowych.

PS. Zostaw swojego maila a dostaniesz informacje o nowych artykułach i planowanych przez mnie kursach.

Photo by Alex Hiller on Unsplash

Grid vs Random search w scikit-learn – co powinieneś wiedzieć o doborze parametrów?

Co ma decydujący wpływ na efektywność w procesie klasyfikacji? Od razu nasuwa się odpowiedź algorytm, ale pamiętajmy nawet najlepszy/najmodniejszy algorytm nie zadziała bez skrupulatnie dobranych parametrów. Jak je dobierać, na co zwrócić uwagę oraz czy losowe przeszukiwanie przestrzeni jest lepsze od podejścia uczesanego wyczerpującego?

Continue reading

Sieć konwolucyjna w Tensorflow do klasyfikacji cyfr z MNIST

Trzeci wpis z serii związanej tworzeniem sieci neuronowych w Tensorflow, tym razem budujemy sieć konwolucyjną do klasyfikacji cyfr z MNIST. Omawiam idee operacji konwolucji dla sieci neuronowych oraz jak ją poprawnie zaimplementować w Tensorflow. W stosunku do poprzednich wpisów z serii sieć ta osiąga najlepszą dokładność klasyfikacji równą 0.9880.

Continue reading