2016-07-17 7 views
2

Ich habe vor kurzem mxnet (Python-Paket) mit GPU-Unterstützung auf Windows 10 und Python 3.5 installiert. Ich gehe ein paar Beispiele durch und sie scheinen gut zu funktionieren.Wie kann ich .csv Trainingsdaten in ein konvolutionelles neuronales Netzwerk in mxnet einspeisen?

Ich bin gewohnt zu scikit-lernen Stil Maschine Lernpakete und sehr neu zu Python Deep Learning-Pakete wie Mxnet, obwohl ich bereits Mxnet in R verwendet habe. Ich habe eine harte Zeit zu verstehen, wie .csv Trainingsdaten zu füttern zum Modell.

Ich möchte zu einem einfachen CNN einige Bilder füttern. Die Bilder sind 28 x 28 Pixel groß und in einer .csv-Datei als abgeflachte Arrays gespeichert. Ich habe zwei .csv-Dateien, eine für das Training und die andere für das Testen. Jede CSV-Datei hat die folgende Struktur:

label, pixel1, pixel2, ..., pixel784 
0,... 
1,... 

Es gibt 10 Etiketten insgesamt und um 1000/300 Bilder im Trainingssatz/Test-Set.

ich den folgenden Code verwenden die Daten zu laden und trainieren, das Modell:

import mxnet as mx 
import pandas as pd 
import numpy as np 
import os 

path = "C://users//me//data" 
os.chdir(path) 

df_train = pd.read_csv("train_28.csv") 
df_test = pd.read_csv("test_28.csv") 

keys = ['pixel.'+str(i) for i in range(1,785)] 

X_train = df_train[keys].get_values().T 
X_train = X_train.reshape((1200,28,28,1)) 
y_train = df_train['label'].get_values().reshape((1200,1)) 
#y_train = y_train.reshape((28,28,1,1200)) 



data = mx.symbol.Variable('data') 

# First conv layer 
conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=20) 
tanh1 = mx.symbol.Activation(data=conv1, act_type="tanh") 
pool1 = mx.symbol.Pooling(data=tanh1, pool_type="max", 
           kernel=(2,2), stride=(2,2)) 

# Second conv layer 
conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), num_filter=50) 
tanh2 = mx.symbol.Activation(data=conv2, act_type="tanh") 
pool2 = mx.symbol.Pooling(data=tanh2, pool_type="max", 
           kernel=(2,2), stride=(2,2)) 

# First fully connected 
flatten = mx.symbol.Flatten(data=pool2) 
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500) 
tanh3 = mx.symbol.Activation(data=fc1, act_type="tanh") 
# second fullc 
fc2 = mx.symbol.FullyConnected(data=tanh3, num_hidden=10) 
# loss 
lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')        

device = mx.gpu()        

model = mx.model.FeedForward.create(lenet, 
            X = X_train, 
            y = y_train, 
            ctx = device, 
            num_epoch = 30) 

ich diesen Ansatz verwenden das die ähnlich ist, ich mit MxNet in R mit wurde, (btw auf R es funktioniert perfekt, ich kann aber nicht die GPU auf R verwenden, so muss ich Python für bessere Leistungen verwenden, ...) aber ich folgende Störung erhalte:

[16:54:11] D:\chhong\mxnet\dmlc-core\include\dmlc/logging.h:235: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input 
Traceback (most recent call last): 
    File "C:\Users\Me\Desktop\esempio_lenet.py", line 57, in <module> 
    num_epoch = 30) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 901, in create 
    eval_batch_end_callback=eval_batch_end_callback) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 745, in fit 
    self._init_params(dict(data.provide_data+data.provide_label)) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 485, in _init_params 
    arg_shapes, _, aux_shapes = self.symbol.infer_shape(**input_shapes) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 453, in infer_shape 
    return self._infer_shape_impl(False, *args, **kwargs) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 513, in _infer_shape_impl 
    ctypes.byref(complete))) 
    File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\base.py", line 77, in check_call 
    raise MXNetError(py_str(_LIB.MXGetLastError())) 
mxnet.base.MXNetError: InferShape Error in convolution0: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input 

Und ich kann nicht herausfinden, was ich falsch mache. Könnte mir bitte jemand sagen, worum es sich bei diesem Fehler handelt und mir eine klare Anleitung geben, wie man .csv-Dateien mit der gleichen Struktur wie oben lädt und ein mxnet-Modell trainiert? Ich habe mir die Dokumentation angeschaut, konnte aber nicht selbst herausfinden, wie CSV-Dateien korrekt geladen werden ...

Der Grund, warum ich nach einem Verfahren zum Laden solcher .csv-Dateien frage, ist, dass ich mich hauptsächlich damit beschäftige Daten in diesem Format und es wäre sehr wertvoll für mich, ein Skript gegen einen Ordner mit diesen .csv-Dateien laufen zu lassen und sie für das Training eines tiefen konvolutionellen neuralen Netzwerks bereit zu haben.

Eine Reihe von Zug und Test .csv-Dateien sind here verfügbar, sollten Sie sie benötigen, um den Beispielcode zu reproduzieren, den ich geschrieben habe.

Danke

Antwort

3

Die Probleme in dieser Linie ist:

X_train = X_train.reshape((1200,28,28,1)) 

In MxNet der zweiten Dimension ist Merkmalskarten, während die dritte und vierte Dimensionen Breite und Höhe sind, soll es so sein sollte:

X_train = X_train.reshape((1200,1,28,28)) 
+1

Vielen Dank, dass das Problem behoben, das ich konfrontiert war. Allerdings stieß ich immer noch auf andere Probleme mit MXnet und entschied mich, mit Python zu Tensorflow zu wechseln, da ich seine Dokumentation im Vergleich zu MXnet viel einfacher finde. Wenn Sie oder jemand anderes ein Tutorial oder eine Ressource vorschlagen könnte, die MXnet ein bisschen mehr Licht bringen könnte, würde ich mich freuen, sie zu lesen. – mickkk