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.
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.
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.
Kommentare werden absichtlich aus Gründen des Versuchs und Irrtums hinterlassen. Es tut mir leid, dass es schwer zu sehen ist, aber bitte verstehe.
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()
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()
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. ..
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