2017-08-23 5 views
0
labels = np.array([['positive'],['negative'],['negative'],['positive']]) 
# output from pandas is similar to the above 
values = (labels=='positive').astype(np.int_) 
to_categorical(values,2) 

Sortie:tflearn to_categorical: traitement des données à partir pandas.df.values: tableau de tableaux

array([[ 1., 1.], 
     [ 1., 1.], 
     [ 1., 1.], 
     [ 1., 1.]]) 

Si je retire la liste intérieure enfermant pour chaque élément, il semble fonctionner très bien

labels = np.array([['positive'],['negative'],['negative'],['positive']]) 
values = (labels=='positive').astype(np.int_) 
to_categorical(values.T[0],2) 

sortie:

array([[ 0., 1.], 
     [ 1., 0.], 
     [ 1., 0.], 
     [ 0., 1.]]) 

Pourquoi est-il Behav de cette façon? Je suis quelques tutoriels, mais ils semblent avoir obtenu la bonne sortie, même pour un tableau de tableaux. Est-ce que cela a été récemment amélioré pour se comporter de cette façon?

J'utilise tflearn (0.3.2) sur py362

Répondre

1

Jetez un oeil au code source pour le to_categorical:

def to_categorical(y, nb_classes): 
    """ to_categorical. 

    Convert class vector (integers from 0 to nb_classes) 
    to binary class matrix, for use with categorical_crossentropy. 

    Arguments: 
     y: `array`. Class vector to convert. 
     nb_classes: `int`. Total number of classes. 

    """ 
    y = np.asarray(y, dtype='int32') 
    if not nb_classes: 
     nb_classes = np.max(y)+1 
    Y = np.zeros((len(y), nb_classes)) 
    Y[np.arange(len(y)),y] = 1. 
    return Y 

La partie de base est la indexation avancéeY[np.arange(len(y)),y] = 1, qui traite le vecteur d'entrée y comme index de colonne dans le tableau de résultat; Alors y doit être un tableau 1d fonctionne correctement, vous obtiendrez généralement une erreur de diffusion pour un tableau 2d arbitraire:

Par exemple:

to_categorical([[1,2,3],[2,3,4]], 2) 

--------------------------------------------------------------------------- IndexError Traceback (most recent call last) in() ----> 1 to_categorical([[1,2,3],[2,3,4]], 2)

c:\anaconda3\envs\tensorflow\lib\site-packages\tflearn\data_utils.py in to_categorical(y, nb_classes) 40 nb_classes = np.max(y)+1 41 Y = np.zeros((len(y), nb_classes)) ---> 42 Y[np.arange(len(y)),y] = 1. 43 return Y 44

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (2,3)

Chacune de ces méthodes fonctionne très bien:

to_categorical(values.ravel(), 2) 
array([[ 0., 1.], 
     [ 1., 0.], 
     [ 1., 0.], 
     [ 0., 1.]]) 

to_categorical(values.squeeze(), 2) 
array([[ 0., 1.], 
     [ 1., 0.], 
     [ 1., 0.], 
     [ 0., 1.]]) 

to_categorical(values[:,0], 2) 
array([[ 0., 1.], 
     [ 1., 0.], 
     [ 1., 0.], 
     [ 0., 1.]]) 
+0

a été mis à jour récemment? Jetez un coup d'oeil à [ce] cahier (https://github.com/udacity/deep-learning/commit/3065d99749e46eb5ff27a48d6a18d887d1f2b2cb), j'ai été coincé dans ce Y 'In [12]', qui semble avoir exécuté impeccable avant, mais seulement maintenant quelqu'un a poussé une mise à jour avec '[xxx, 0]' –

+0

Il se pourrait aussi que le précédent 'Y' soit une série de pandas et maintenant' Y' a été changé en une trame de données à une colonne. Juste une supposition. – Psidom