[PYTHON] Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert

Ich habe Deep Learning mit Pylearn2 ausprobiert. Ich habe es nicht mit anständigen Daten getestet und ich habe keine anständige Ausgabe, daher wäre es hilfreich, wenn Sie es lesen könnten, um die Atmosphäre von Pylearn2 zu erfassen: "Hmm, ist Pylearn2 so?" Ich werde.

Installation von Pylearn 2

Bitte beziehen Sie sich vorerst auf das offizielle Dokument. Abhängig von der Version von theano kann ein Fehler auftreten. In diesem Fall lesen Sie bitte den folgenden Stapelüberlauf.

Referenzmaterial

Wenn Sie vorerst das Computer Vision-Handbuch 6 lesen, Deep Learning-Tutorials lesen und es mit theano implementieren, werden Sie Deep Learning irgendwie verstehen. Ich kann es übrigens nur irgendwie verstehen. .. In Bezug auf die Implementierung in theano gibt es einen Beitrag mit einer leicht verständlichen Erklärung der Methode in sinhrks 'Blog, daher denke ich, dass dies die Lernkosten senken wird. Auch Einführung in Theano durch Intelligent Information Systems Co., Ltd. wird sehr hilfreich sein. Wir empfehlen, dass Sie es zusammen lesen.

Was ich getan habe

  1. binäre Erzeugung unbeaufsichtigter künstlicher Daten
  2. DBM-Schulung
  3. Zeigen Sie das Ergebnis des erstellten DBM an

Referenzcode

Kommentare werden absichtlich aus Gründen des Versuchs und Irrtums hinterlassen. Es tut mir leid, dass es schwer zu sehen ist, aber bitte verstehe.

Generierung von Bevölkerungsdaten

Erstellen und speichern Sie toy_train.csv und toy_train.pkl (als serielles Pylearn2-Objekt speichern).

create_toy_dataset.py


import numpy
from pylearn2.datasets import DenseDesignMatrix
from pylearn2.utils import serial

class ToyDataset(DenseDesignMatrix):
    def __init__(self):
        rng = numpy.random.RandomState(seed=42)
        data = numpy.array( [rng.randint(0,2,200) for _ in range(1000)] )
        self.data = data
        super(ToyDataset, self).__init__(X=data) #, y=self.y)

def main():
    train = ToyDataset()
    train.use_design_loc('./toy_train_design.npy')
    rng = numpy.random.RandomState(seed=42)

    train_csv_path = './toy_train.csv'
    train_pkl_path = './toy_train.pkl'
    data = numpy.array( [rng.randint(0,2,200) for _ in range(1000)] ,dtype=numpy.int)
    numpy.savetxt(train_csv_path, data, delimiter=',',fmt='%d')
    serial.save(train_pkl_path, train)

if __name__ == '__main__':
    main()

Pylearn2-Konfigurations-Yaml-Datei

Ich habe versucht, die CSV-Datei direkt zu lesen und zu verschieben, aber es hat nicht funktioniert, also habe ich die pkl-Datei gelesen und verwendet. Das CSV-Dataset-Trennzeichen ist standardmäßig ein Komma. Wenn in numpy.savetxt kein Trennzeichen angegeben ist, schreiben Sie das Trennzeichen in CSVDataset der yaml-Datei in einen Bereich halber Breite. Wenn keine Beschriftung vorhanden ist, schreiben Sie expected_labels: False, und wenn kein Header vorhanden ist, schreiben Sie expected_headers: False. Weitere Informationen finden Sie im Offiziellen Dokument. Für die Datenstruktur beim Erstellen eigener Daten [Pylearn2 möchte ich beginnen](http://laughing.hatenablog.com/entry/2013/11/30/pylearn2_%E5%85%A5%E9%96% 80% E3% 81% 97% E3% 81% 9F% E3% 81% 84% E7% B7% A8) werden hilfreich sein. Wie Sie sehen können, ist der Koeffizient entsprechend eingestellt. Bitte beziehen Sie sich nicht darauf. Für das Üben von Deep Learning habe ich Ein praktischer Leitfaden zum Training von Redstricted Boltzmann Machine [Deep Learning von RBM-Black] zusammengefasst Mit Magie ~](http://qiita.com/t_Signull/items/f776aecb4909b7c5c116) wird hilfreich sein. Ich persönlich fand auch die Dynamik Implementierung von Dropout und Regularisierung von Gewichten hilfreich.

grbm_dbm.yaml


!obj:pylearn2.train.Train {
    dataset: &data !obj:pylearn2.datasets.binarizer.Binarizer {
        raw: &raw_train !pkl: "toy_train.pkl",
    },
    #dataset: &train !obj:pylearn2.datasets.csv_dataset.CSVDataset {
    #    path: %(path)s,
    #    start: %(start)i,
    #    stop: %(stop)i,
    #    expect_labels: False,
    #    expect_headers: False
    #},
    model: !obj:pylearn2.models.dbm.DBM {
        batch_size: %(batch_size)i,
        niter: 5,
        visible_layer: !obj:pylearn2.models.dbm.BinaryVector {
            nvis: %(nvis)i,
            bias_from_marginals: *raw_train,
        },
        hidden_layers: [
                 !obj:pylearn2.models.dbm.BinaryVectorMaxPool {
                     layer_name: 'h1',
                     detector_layer_dim: %(detector_layer_dim1)i,
                     pool_size: 1,
                     irange: .05,
                     init_bias: -2.,
                 },
                 !obj:pylearn2.models.dbm.BinaryVectorMaxPool {
                     layer_name: 'h2',
                     detector_layer_dim: %(detector_layer_dim2)i,
                     pool_size: 1,
                     irange: .05,
                     init_bias: -2.,
                 },
                 !obj:pylearn2.models.dbm.BinaryVectorMaxPool {
                     layer_name: 'y',
                     detector_layer_dim: %(detector_layer_dim3)i,
                     pool_size: 1,
                     irange: .05,
                     init_bias: -2.,
                 }
                 #!obj:pylearn2.models.dbm.Softmax {
                 #    layer_name: 'y',
                 #    max_col_norm: 1.9365,
                 #    #supervised: False,
                 #    n_classes: 10,
                 #    irange: .05,
                 #}
        ],
    },
    algorithm: !obj:pylearn2.training_algorithms.sgd.SGD {
        learning_rate: .05,
        learning_rule: !obj:pylearn2.training_algorithms.learning_rule.Momentum {
            init_momentum: .5,
        },
        monitoring_batches: %(monitoring_batches)i,
        monitoring_dataset: { 'train': *data
                              #'test': !obj:pylearn2.datasets.csv_dataset.CSVDataset {
                              #          path: %(path)s,
                              #          start: %(test_start)i,
                              #          stop: %(test_stop)i,
                              #          expect_labels: False,
                              #          expect_headers: False
                              #},
                            },
        cost: !obj:pylearn2.costs.cost.SumOfCosts {
            costs: [
                !obj:pylearn2.costs.dbm.VariationalPCD {
                    num_chains: 100,
                    num_gibbs_steps: 5
                },
                !obj:pylearn2.costs.dbm.WeightDecay {
                    coeffs: [.0001, .0001, .0001]
                },
                !obj:pylearn2.costs.dbm.TorontoSparsity {
                    targets: [.2, .2, .2],
                    coeffs: [.001, .001, .001],
                }
            ],
        },
        termination_criterion: !obj:pylearn2.termination_criteria.EpochCounter { max_epochs: %(max_epochs)i },
        update_callbacks: [
            !obj:pylearn2.training_algorithms.sgd.ExponentialDecay {
                decay_factor: 1.000015,
                min_lr: .000001
            }
        ]
    },
    extensions: [
        !obj:pylearn2.training_algorithms.learning_rule.MomentumAdjustor {
            final_momentum: .9,
            start: 5,
            saturate: 6
        }
    ],
    save_path: "%(save_path)s/grbm_dbm.pkl",
    save_freq: 1
}

training Ich erhalte eine Fehlermeldung, wenn ich die ToyDataset-Klasse nicht in den Datensatz von pylearn2 einfüge, aber es scheint gut zu funktionieren, selbst wenn ich sie direkt in die Trainingsquelle schreibe. Daher gibt es im folgenden Code eine Beschreibung (bedeutungslos).

train_dbm.py


import os

from nose.plugins.skip import SkipTest
from theano import config

import pylearn2
from pylearn2.datasets import DenseDesignMatrix
from pylearn2.testing import skip
from pylearn2.testing import no_debug_mode
from pylearn2.utils.serial import load_train_file
from pylearn2.config import yaml_parse

class ToyDataset(DenseDesignMatrix):
    def __init__(self):
        rng = numpy.random.RandomState(seed=42)
        data = numpy.array( [rng.randint(0,200,200) for _ in range(1000)] )
        super(ToyDataset, self).__init__(X=data)#, y=self.y)

@no_debug_mode
def train_yaml(yaml_file):
    train = yaml_parse.load(yaml_file)
    train.main_loop()

def train(yaml_file_path, save_path):
    yaml = open("{0}/grbm_dbm.yaml".format(yaml_file_path), 'r').read()
    hyper_params = {'batch_size': 100,
                    'nvis': 200,
                    'detector_layer_dim1': 300,
                    'detector_layer_dim2': 300,
                    'detector_layer_dim3': 10,
                    'monitoring_batches': 10,
                    'max_epochs': 100,
                    'save_path': save_path}
    yaml = yaml % (hyper_params)
    train_yaml(yaml)

def train_dbm():
    skip.skip_if_no_data()
    yaml_file_path = '.'
    save_path = '.'
    train(yaml_file_path, save_path)

if __name__ == '__main__':
    train_dbm()

Anzeige der Lernergebnisse

dbm_result.py


import numpy as np
import pickle
import sys
import theano
from pylearn2.space import VectorSpace
from pylearn2.datasets import DenseDesignMatrix

class ToyDataset(DenseDesignMatrix):
    def __init__(self):
        rng = numpy.random.RandomState(seed=42)
        data = numpy.array( [rng.randint(0,2,200) for _ in range(1000)] )
        super(ToyDataset, self).__init__(X=data)#, y=self.y)

def simulate(inputs, model):
    print dir(model)
    space = VectorSpace(inputs.shape[1])
    X = space.get_theano_batch()
    q = model.mf(space.format_as(X, model.get_input_space()))
    f = theano.function([X], q[-1])
    result = []
    batch_size = 100
    for x in xrange(0, len(inputs), batch_size):
        result.extend(f(inputs[x:x + batch_size]))
        print "len:", len(result)
        print result[0]
    return result

def countCorrectResults(outputs):
    correct = 0;
    for output in outputs:
        for out_vec in output:
            print np.argmax(out_vec)

def score(dataset, model):
    outputs = simulate(dataset.X, model)
    countCorrectResults(outputs)

model = pickle.load(open('grbm_dbm.pkl')) #Post-Learning-Modell
test_data = pickle.load(open('toy_train.pkl')) #Daten für das Training verwendet
score(test_data, model)

Als Ergebnis des Verschiebens des obigen Codes erhielt ich ein unklares Ergebnis, dass der Wahrscheinlichkeitswert bei Index 6 für alle Daten w maximal wird Ich habe das Gefühl, dass etwas nicht stimmt oder dass etwas grundlegend falsch ist. ..

Kommentar

Es gibt einige Module, die sich auf Github befinden, aber in der Pylearn2-Dokumentation nicht erwähnt werden. Ich denke, es ist ziemlich schwierig, sie richtig zu verschieben. Ich glaube nicht, dass Pylearn2 mit der Dokumentation Schritt hält, aber es gibt einige, die einen Überblick über die Methode haben. Sehen Sie sich also das Dokument kurz an, um festzustellen, ob es etwas gibt, das mit einer Methode, die Sie nicht kennen, effizient zu sein scheint. Ich bin der Meinung, dass Sie effizient lernen können, wenn Sie das Papier der Methode lesen, an der Sie interessiert sind. (Ich fühle mich ...)

Zusätzlich zu dem, was ich oben getan habe, habe ich dumme Dinge getan und versucht zu sehen, ob ich RBM ohne einen Lehrer mit MLP betreiben kann. Es scheint jedoch, dass MLP nur Lehrer akzeptiert (ein Fehler tritt während des Monitenrings auf).

Wir entschuldigen uns für die Unannehmlichkeiten, würden uns aber freuen, wenn Sie auf Fehler hinweisen könnten.

Recommended Posts

Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, mit Scrapy Daten von einer Website zu sammeln
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe fp-Wachstum mit Python versucht
Künstliche Datengenerierung mit Numpy
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, mit PyCaret zu clustern
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen
Ich habe versucht, scRNA-seq-Daten mithilfe der topologischen Datenanalyse (TDA) zu analysieren.
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe AdaNet gegen Tabellendaten ausprobiert
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe versucht, Sätze mit summpy zusammenzufassen