[PYTHON] [Deep Learning] Bildklassifizierung mit Faltungsnetz [DW Tag 4]

Grob gesagt

Was ist AlexNet?

Das im folgenden Artikel vorgeschlagene neuronale Netz. Spitzenleistung in ILSVRC 2012. Danach erschien ein Netzwerk namens VGG der Universität Oxford, das AlexNet vertiefte, und die Leistung wurde verbessert. (Ab 2016 gibt es GoogLeNet, das die Leistung noch mehr übertrifft. Es scheint genauer zu sein als Menschen.)

↓ Es gibt auch eine Probe von Chainer.

Dieses Mal habe ich eine heruntergekommene Version von AlexNets Netzwerk geschrieben und die Bilder tatsächlich klassifiziert. Der Grund für die Verschlechterung besteht einfach darin, die Anzahl der Dimensionen des Netzwerks zu verringern, um den Speichermangel zu beheben.

Das diesmal erstellte Netzwerk sieht wie folgt aus.

class cnn(Chain):

  def __init__(self):
    super(cnn, self).__init__(
      conv1=L.Convolution2D(3, 48, 3, stride=1),
      bn1=L.BatchNormalization(48),
      conv2=L.Convolution2D(48, 128, 3, pad=1),
      bn2=L.BatchNormalization(128),
      conv3=L.Convolution2D(128, 192, 3, pad=1),
      conv4=L.Convolution2D(192, 192, 3, pad=1),
      conv5=L.Convolution2D(192, 128, 3, pad=1),
      fc6=L.Linear(2048, 1024),
      fc7=L.Linear(1024, 1024),
      fc8=L.Linear(1024, 10),
    )
    self.train = True

  def clear(self):
    self.loss = None
    self.accuracy = None

  def forward(self, x_data, t_data):
    self.clear()
    x, t = chainer.Variable(x_data, volatile=False), chainer.Variable(t_data, volatile=False)

    h = self.bn1(self.conv1(x), test=not self.train)
    h = F.max_pooling_2d(F.relu(h), 3, stride=2)
    h = self.bn2(self.conv2(h), test=not self.train)
    h = F.max_pooling_2d(F.relu(h), 3, stride=2)
    h = F.relu(self.conv3(h))
    h = F.relu(self.conv4(h))
    h = F.relu(self.conv5(h))
    h = F.max_pooling_2d(F.relu(h), 2, stride=2)
    h = F.dropout(F.relu(self.fc6(h)), train=self.train)
    h = F.dropout(F.relu(self.fc7(h)), train=self.train)
    h = self.fc8(h)

    self.loss = F.softmax_cross_entropy(h, t)
    self.accuracy = F.accuracy(h, t)

    if self.train:
      return self.loss, self.accuracy
    else:
      return h.data, self.accuracy

Wie Sie durch einen Vergleich mit dem Chainer-Beispiel sehen können, werden die Anzahl der Kernel und die Filtergröße reduziert.

Bilddaten

Ich habe den CIFAR-10-Datensatz in ↓ verwendet.

CIFAR-10 dataset

Dies ist ein Datensatz mit 6000 Bildern von 10 Klassen wie Flugzeugen und Tieren pro Klasse. Die Größe eines Bildes beträgt $ 32 \ mal 32 $ und es hat 3 RGB-Kanäle. Bitte gibt es auch ein Beispiel, das Daten mit Python liest und in einem Array speichert. Die Struktur der von dieser Methode gelesenen Daten ist jedoch, dass die ersten $ 1024 (= 32 \ mal 32) $ Elemente R sind, die nächsten $ 1024 $ G sind und die nächsten $ 1024 $ B sind, also Chianer Es muss in eine Form konvertiert werden, die von der Funktion Convolution2D () von gelesen werden kann.

Ich habe es wie folgt unter Bezugnahme auf die folgende Site konvertiert.

x_train = x_train.reshape((len(x_train), 3, 32, 32))

Von den insgesamt 60000 $ Blättern in der $ 6000 $ Blätter $ \ mal 10 $ Klasse wurden diesmal $ 10000 $ Blätter als Trainingsdaten und $ 10000 $ Blätter als Testdaten verwendet. Durch Erhöhen der Anzahl der Trainingsdaten wird die Genauigkeit verbessert.

Leistungsbeurteilung

Das Ergebnis, wenn die Lernschleife um 20 Epochen gedreht wird. Die Genauigkeit betrug ca. 56%.

Ganzer Code

!/usr/bin/env python
 -*- coding: utf-8 -*-

__version__ = '0.0.1'

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import re
import logging
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

import pprint
def pp(obj):
  pp = pprint.PrettyPrinter(indent=1, width=160)
  str = pp.pformat(obj)
  print re.sub(r"\\u([0-9a-f]{4})", lambda x: unichr(int("0x"+x.group(1),16)), str)

import os, math, time

import numpy as np
import cPickle as pickle
import copy

import chainer
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils, Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

import subprocess

def unpickle(f):
  import cPickle
  fo = open(f, 'rb')
  d = cPickle.load(fo)
  fo.close()
  return d

def load_cifar10(datadir, n_batch):
  train_data = []
  train_target = []

  if n_batch > 5:
    return -1

  # load train data
  for i in range(1, n_batch+1):
    d = unpickle("%s/data_batch_%d" % (datadir, i))
    train_data.extend(d["data"])
    train_target.extend(d["labels"])

  # load test data
  d = unpickle("%s/test_batch" % (datadir))
  test_data = d["data"]
  test_target = d["labels"]

  train_data = np.array(train_data, dtype=np.float32)
  train_target = np.array(train_target, dtype=np.int32)
  test_data = np.array(test_data, dtype=np.float32)
  test_target = np.array(test_target, dtype=np.int32)

  # normalization
  train_data /= 255.0
  test_data /= 255.0

  return train_data, test_data, train_target, test_target

"""
CNN with Batch-Normalization
"""

class cnn(Chain):

  def __init__(self):
    super(cnn, self).__init__(
      conv1=L.Convolution2D(3, 48, 3, stride=1),
      bn1=L.BatchNormalization(48),
      conv2=L.Convolution2D(48, 128, 3, pad=1),
      bn2=L.BatchNormalization(128),
      conv3=L.Convolution2D(128, 192, 3, pad=1),
      conv4=L.Convolution2D(192, 192, 3, pad=1),
      conv5=L.Convolution2D(192, 128, 3, pad=1),
      fc6=L.Linear(2048, 1024),
      fc7=L.Linear(1024, 1024),
      fc8=L.Linear(1024, 10),
    )
    self.train = True

  def clear(self):
    self.loss = None
    self.accuracy = None

  def forward(self, x_data, t_data):
    self.clear()
    x, t = chainer.Variable(x_data, volatile=False), chainer.Variable(t_data, volatile=False)

    h = self.bn1(self.conv1(x), test=not self.train)
    h = F.max_pooling_2d(F.relu(h), 3, stride=2)
    h = self.bn2(self.conv2(h), test=not self.train)
    h = F.max_pooling_2d(F.relu(h), 3, stride=2)
    h = F.relu(self.conv3(h))
    h = F.relu(self.conv4(h))
    h = F.relu(self.conv5(h))
    h = F.max_pooling_2d(F.relu(h), 2, stride=2)
    h = F.dropout(F.relu(self.fc6(h)), train=self.train)
    h = F.dropout(F.relu(self.fc7(h)), train=self.train)
    h = self.fc8(h)

    self.loss = F.softmax_cross_entropy(h, t)
    self.accuracy = F.accuracy(h, t)

    if self.train:
      return self.loss, self.accuracy
    else:
      return h.data, self.accuracy

if __name__ == '__main__':
  from argparse import ArgumentParser
  parser = ArgumentParser(description='RAE')
  parser.add_argument('--data_dir', type=unicode, default='', help='directory path to the cifar10 data')
  parser.add_argument('--n_data', type=int, default=1, help='# of data')
  parser.add_argument('--n_epoch', type=int, default=20, help='# of epochs')
  parser.add_argument('--batchsize', type=int, default=1, help='size of mini-batch')
  parser.add_argument('--gpu', type=int, default=-1, help='GPU ID (negative value indicates CPU)')

  args = parser.parse_args()

  """
  Get params
  """
  # the number of training itaration
  n_epoch = args.n_epoch

  # the size of mini batch
  batchsize = args.batchsize

  # define cupy
  xp = cuda.cupy if args.gpu >= 0 else np

  """
  Load data
  """
  print 'load CIFAR-10 dataset'
  x_train, x_test, y_train, y_test = load_cifar10(args.data_dir, args.n_data)

  N_train = y_train.size
  N_test = y_test.size

  print N_train, N_test

  x_train = x_train.reshape((len(x_train), 3, 32, 32))
  x_test = x_test.reshape((len(x_test), 3, 32, 32))

  """
  Prepare Acnn model
  """
  model = cnn()

  """
  Setup optimizer
  """
  optimizer = optimizers.SGD()
  optimizer.setup(model)

  """
  Setup GPU
  """
  if args.gpu >= 0:
    cuda.get_device(args.gpu).use()
    model.to_gpu()

  """
  Training Loop
  """
  for epoch in range(1, n_epoch + 1):
    print "epoch: %d" % epoch
    perm = np.random.permutation(N_train)

    sum_loss = 0
    for i in range(0, N_train, batchsize):
      x_batch = xp.asarray(x_train[perm[i:i + batchsize]])
      y_batch = xp.asarray(y_train[perm[i:i + batchsize]])

      optimizer.zero_grads()
      loss, acc = model.forward(x_batch, y_batch)
      loss.backward()
      optimizer.update()
      sum_loss += float(loss.data) * len(y_batch)

    print "train mean loss: %f" % (sum_loss / N_train)

    sum_accuracy = 0
    for i in range(0, N_test, batchsize):
      x_batch = xp.asarray(x_test[i:i + batchsize])
      y_batch = xp.asarray(y_test[i:i + batchsize])

      loss, acc = model.forward(x_batch, y_batch)
      sum_accuracy += float(acc.data) * len(y_batch)

    print "test accuracy: %f" % (sum_accuracy / N_test)

Verknüpfung

Tiefes Lernen gründlich studieren [DW Tag 0]

Recommended Posts

[Deep Learning] Bildklassifizierung mit Faltungsnetz [DW Tag 4]
[Deep Learning] Untersuchen Sie, wie jede Funktion des Faltungsnetzes verwendet wird [DW Tag 3]
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Bildklassifizierung mit selbst erstelltem neuronalen Netzwerk von Keras und PyTorch
Einfaches Klassifizierungsmodell mit neuronalem Netz
Studiere gründlich Deep Learning [DW Tag 0]
Deep Learning 2 durch Implementierung gelernt (Bildklassifizierung)
[Chainer] Dokumentklassifizierung nach Faltungsnetzwerk
[Python / Maschinelles Lernen] Warum Deep Learning # 1 Perceptron Neural Network
Implementieren Sie das Convolutional Neural Network
Erfahrung mit faltbaren neuronalen Netzen
Deep Learning Bildanalyse beginnend mit Kaggle und Keras
[Deep Learning] Führen Sie die neuronale SONY-Netzwerkkonsole über CUI aus
<Kurs> Tiefes Lernen: Day2 CNN
Neuronales Netzwerk mit Python (Scikit-Learn)
3. Normalverteilung mit neuronalem Netz!
<Kurs> Tiefes Lernen: Tag 1 NN
Deep Kernel Learning mit Pyro
Versuchen Sie Deep Learning mit FPGA
Neuronales Netz beginnend mit Chainer
Themen> Deep Learning: Tag 3 RNN
4. Kreisparameter mit einem neuronalen Netzwerk!
Selbstgesteuertes Lied durch tiefes Lernen (gestapelte LSTM-Ausgabe) [DW Tag 6]
Generiere Pokemon mit Deep Learning
Kapitel 7 [Deep Learning für neuronale Netze] P252 ~ 275 (erste Hälfte) [Lernen Sie, indem Sie sich mit Python bewegen! Neues Lehrbuch für maschinelles Lernen]
Echtzeitklassifizierung mehrerer Objekte in Kamerabildern mit tiefem Erlernen von Raspberry Pi 3 B + & PyTorch
Lua-Version Deep Learning von Grund auf neu Teil 6 [Inferenzverarbeitung für neuronale Netze]
[Textklassifizierung] Ich habe versucht, Faltungsneurale Netze für die Satzklassifizierung mit Chainer zu implementieren
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 9 heraus. Lernen, Speichern und Laden von Modellen
Identifikation der Katzenrasse mit Deep Learning
Neuronales Netzwerk mit OpenCV 3 und Python 3
Machen Sie ASCII-Kunst mit tiefem Lernen
Versuchen Sie es mit TensorFlow Part 2
Was ist das Convolutional Neural Network?
[TensorFlow] [Keras] Aufbau eines neuronalen Netzwerks mit Keras
Bildklassifizierung mit Weitwinkel-Fundusbilddatensatz
Überprüfen Sie die Kniebeugenform mit tiefem Lernen
Deep Learning Bilderkennung 2 Modellimplementierung
Kategorisieren Sie Nachrichtenartikel mit Deep Learning
Snack-Umsatzprognose mit Deep Learning
Bringen Sie Menschen mit Deep Learning zum Lächeln
[AI] Deep Learning für das Entrauschen von Bildern
Erstellen Sie mithilfe des TensorFlow-Faltungsnetzwerks einen Klassifikator mit einer Handschrifterkennungsrate von 99,2%
Fügen Sie Ihre eigenen Bilddaten in Deep Learning ein und spielen Sie damit
"Klassifizierung von Müll nach Bild!" App-Erstellungstagebuch Tag3 ~ Webanwendung mit Django ~
Erstellt ein Bildunterscheidungsmodell (cifar10) unter Verwendung eines Faltungs-Neuronalen Netzwerks
[Rabbit Challenge (E-Qualifikation)] Deep Learning (Tag 2)
Bildklassifizierung mit Keras-Von der Vorverarbeitung zum Klassifizierungstest-
Klassifizieren Sie Anime-Gesichter mit tiefem Lernen mit Chainer
Implementierung eines 3-Schicht-Neuronalen Netzwerks (kein Lernen)
<Kurs> Deep Learning Day4 Stärkung des Lernens / Tensorflusses
Bilderkennungsmodell mit Deep Learning im Jahr 2016
Probieren Sie die Bitcoin-Preisprognose mit Deep Learning aus
Versuchen Sie es mit Chainer Deep Q Learning - Launch
Versuchen Sie es mit TensorFlow-Part 2-Convolution Neural Network (MNIST).
Versuchen Sie mit Kipoi tiefes Erlernen der Genomik
Behalten Sie das mit PyBrain aufgebaute neuronale Netzwerk bei