Saját adathalmaz használata CNN-hez

A Tensorflow oldalán lévő tutorialokban általában MNIST datasetet töltenek be a neurális háló tanítására és validálására. A képek előkészítését pythonban végzem.

Erre egy példa:

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Tehát a load_data() függvény feltölti a train_images, train_labels, test_images és test_labels változókat, melyek numpy arrayként fogják tárolni az adatokat.
Ehhez hasonlóan megírható egy saját load_data() függvény, ha saját adathalmazt szeretnénk használni.

Az adathalmazom 256×256-os színes képekből áll.
Szükség lesz az adathalmaz elérési útvonalára, majd a képeket tartalmazó mappát be kell járni, a fájlokon esetleges módosításokat végezni és eltárolni azokat.
A képek például sources mappán belüli train és val mappákban szerepelnek elkülönítve. A használathoz szükségünk van az elérési útvonalra:

train_dir = os.path.dirname(os.path.realpath('__file__'))+r'\sources\train'

Hasonlóan a validációs adatok mappája is eltárolandó a ‘train’ szót kicserélve ‘val’-ra.
Az útvonal ismeretében bejárható a mappa, ehhez egy segédmetódust fogok használni.

  • A directory elérési útvonalú mappát járom be (ez nálam a train vagy a val), ezen belül szerepelnek kategóriánként a képek, ezeket a kategórianeveket mentem el labelként.
  • Az inner_dir a kategória mappa neve, ebből csinálok elérési útvonalat.
  • A kategória mappákban lévő képek beolvasása scipy lib haszálatával. Esetleges módosítások.
  • Adatok numpy array-jé alakítása
  • Visszatérés (data, labels) formában.
def load_data_by_dir(directory):
    for inner_dir in os.listdir(directory):
        category = directory+'\\'+os.fsdecode(inner_dir)
        for file_name in os.listdir(category):
            img = misc.imread(category+'\\'+file_name)
            data.append(img)
            labels.append(inner_dir)
        data = np.asarray(data)
        labels = np.asarray(labels)
    return (data, labels)

A saját load_data függvényünkben meghívjuk ezt a segéd függvényt kétszer, paraméterben egyszer a train_dir-t, egyszer pedig a val_dir-t átadva. A segédfüggvények értékével pedig visszatérünk (train_images, train_labels), (test_images, test_labels) formában.

Felmerülő problémák:

  • Fekete fehér kép keveredik a színesek közé, ennek más lesz az alakja is.
 if img.shape != (256, 256, 3): img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
  • Lebegőpontos számábrázolásban kell tárolni a képeket egész számok helyett.
 img = np.float32(img)
  • Képek értékeit normalizálni kell.
 img = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
  • Képek átméretezése. Itt felére.
 img = misc.imresize(img, 0.5)
  • A labeleknek is számoknak kell lenniük!

 

Convolutional Neural Networks és Tensorflow

Korábban már írtam a konvolúciós neurális hálózatok felépétéséről, ez a poszt a következő linken érhető el: http://www.dotnetszeged.hu/mic/?p=1750
Most pedig azt szeretném bemutatni, hogy a tensorflow segítségével miként lehet felépíteni a modellünket.
A modell megalkotásához a tf.layers modulra van szükség, mely metódusokat tartalmaz az egyes rétegek beállításához.
Continue reading

Convolutional Neural Network felépítése dióhéjban

Egy képről megállapítani, hogy mi látható rajta, az emberek számára nem bonyolult feladat. Különös erőfeszítés nélkül képesek vagyunk a körülöttünk levő tárgyakat címkékkel ellátni. A számítógépek viszont nem rendelkeznek ilyen tulajdonsággal. Ahhoz hogy mégis képesek legyenek ezekre a dolgokra, neurális hálók segítségével kell megtanítani őket.
Képek osztályozására használatos konvolúciós neurális hálók területe 2012-től robbanásszerűen kezdett fejlődni, amikor Alex Krizhevsky megnyerte az ImageNet versenyét azzal, hogy a hibázási rátát 26%-ról 15%-ra csökkentette. Continue reading