2016-07-17 7 views
2

J'ai récemment installé mxnet (paquet python) avec la prise en charge du GPU sous Windows 10 et Python 3.5. Je cours à travers quelques exemples et ils semblent bien fonctionner. Je suis habitué aux paquets d'apprentissage machine de style scikit-learn et très nouveau aux paquets d'apprentissage en profondeur Python tels que Mxnet bien que j'aie déjà utilisé Mxnet dans R. J'ai du mal à comprendre comment alimenter les données d'entraînement .csv au modèle.Comment puis-je transmettre des données d'entraînement .csv à un réseau de neurones convolutionnels dans mxnet?

Je voudrais alimenter un CNN simple quelques images. Les images sont 28x28 pixels et stockées sous forme de tableaux aplatis dans un fichier .csv. J'ai deux fichiers .csv, un pour la formation et l'autre pour les tests. Chaque fichier .csv a la structure suivante:

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

Il y a 10 étiquettes au total et environ 1000/300 images dans l'ensemble jeu/test de formation.

J'utilise le code suivant pour charger les données et former le modèle:

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) 

J'utilise cette approche qui est similaire à celui que j'utilisais avec mxnet dans R, (BTW sur R, il fonctionne parfaitement, mais je ne peux pas utiliser le GPU sur R, alors je dois utiliser Python pour de meilleures performances ...) mais j'obtiens l'erreur suivante:

[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 

Et je ne peux pas comprendre ce que je fais mal. Pourriez-vous s'il vous plaît quelqu'un me dire quelle est cette erreur et me fournir un ensemble d'instructions claires sur la façon de charger des fichiers .csv avec la même structure que ci-dessus et former un modèle mxnet? J'ai jeté un coup d'oeil à la documentation mais je n'ai pas pu déterminer moi-même comment charger les fichiers .csv correctement ...

La raison pour laquelle je demande une procédure pour charger de tels fichiers .csv est que je m'occupe surtout de données dans ce format et il serait très utile pour moi d'être en mesure d'exécuter un script sur un dossier avec ces fichiers .csv et les avoir prêts à être utilisés pour la formation d'un réseau de neurones convolutionnels profonds.

Un ensemble de fichiers .csv de train et de test est disponible here si vous en avez besoin pour reproduire l'exemple de code que j'ai écrit.

Merci vous

Répondre

3

Les problèmes est dans cette ligne:

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

Dans la deuxième dimension mxnet est des cartes de fonction, alors que les troisième et quatrième dimensions sont la largeur et la hauteur, il devrait donc être:

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

Merci, cela a résolu le problème auquel je faisais face. Cependant, j'ai encore rencontré d'autres problèmes avec MXnet et j'ai décidé de passer à tensorflow avec Python puisque je trouve sa documentation beaucoup plus simple par rapport à MXnet. Cela dit, si vous ou quelqu'un d'autre pourrait suggérer un tutoriel ou une ressource qui pourrait mettre un peu plus de lumière sur MXnet, je serais heureux d'avoir une lecture. – mickkk