Réseau de neurones toujours prédit la même classe

Je suis en train de mettre en œuvre un réseau de neurones qui classe les images dans l'une des deux catégories distinctes. Le problème est, cependant, qu'il a toujours prédit 0 pour toute entrée et je ne suis pas vraiment sûr de savoir pourquoi.

Voici ma fonction de la méthode d'extraction:

def extract(file):
    # Resize and subtract mean pixel
    img = cv2.resize(cv2.imread(file), (224, 224)).astype(np.float32)
    img[:, :, 0] -= 103.939
    img[:, :, 1] -= 116.779
    img[:, :, 2] -= 123.68
    # Normalize features
    img = (img.flatten() - np.mean(img)) / np.std(img)

    return np.array([img])

Voici ma descente de gradient de routine:

def fit(x, y, t1, t2):
    """Training routine"""
    ils = x.shape[1] if len(x.shape) > 1 else 1
    labels = len(set(y))

    if t1 is None or t2 is None:
        t1 = randweights(ils, 10)
        t2 = randweights(10, labels)

    params = np.concatenate([t1.reshape(-1), t2.reshape(-1)])
    res = grad(params, ils, 10, labels, x, y)
    params -= 0.1 * res

    return unpack(params, ils, 10, labels)

Voici mon avant et à l'arrière(gradient) propagations:

def forward(x, theta1, theta2):
"""Forward propagation"""
m = x.shape[0]
# Forward prop
a1 = np.vstack((np.ones([1, m]), x.T))
z2 = np.dot(theta1, a1)
a2 = np.vstack((np.ones([1, m]), sigmoid(z2)))
a3 = sigmoid(np.dot(theta2, a2))
return (a1, a2, a3, z2, m)
def grad(params, ils, hls, labels, x, Y, lmbda=0.01):
"""Compute gradient for hypothesis Theta"""
theta1, theta2 = unpack(params, ils, hls, labels)
a1, a2, a3, z2, m = forward(x, theta1, theta2)
d3 = a3 - Y.T
print('Current error: {}'.format(np.mean(np.abs(d3))))
d2 = np.dot(theta2.T, d3) * (np.vstack([np.ones([1, m]), sigmoid_prime(z2)]))
d3 = d3.T
d2 = d2[1:, :].T
t1_grad = np.dot(d2.T, a1.T)
t2_grad = np.dot(d3.T, a2.T)
theta1[0] = np.zeros([1, theta1.shape[1]])
theta2[0] = np.zeros([1, theta2.shape[1]])
t1_grad = t1_grad + (lmbda / m) * theta1
t2_grad = t2_grad + (lmbda / m) * theta2
return np.concatenate([t1_grad.reshape(-1), t2_grad.reshape(-1)])

Et voici ma fonction de prédiction:

def predict(theta1, theta2, x):
"""Predict output using learned weights"""
m = x.shape[0]
h1 = sigmoid(np.hstack((np.ones([m, 1]), x)).dot(theta1.T))
h2 = sigmoid(np.hstack((np.ones([m, 1]), h1)).dot(theta2.T))
return h2.argmax(axis=1)

Je peux voir que le taux d'erreur diminue progressivement à chaque itération, généralement convergent, quelque part autour de 1.26 e-05.

Ce que j'ai essayé jusqu'à présent:

  1. PCA
  2. Différents ensembles de données (Iris à partir de sklearn manuscrits et des numéros de Coursera ML sûr, la réalisation de près de 95% de précision sur les deux). Toutefois, ces deux ont été traitées dans un lot, donc je peux supposer que mon général, la mise en œuvre est correcte, mais il ya quelque chose de mal avec soit la façon dont j'ai extrait de fonctionnalités, ou comment j'ai former le classificateur.
  3. Essayé sklearn de SGDClassifier et elle n'a pas joué beaucoup mieux, me donner un ~50% de précision. Donc quelque chose de mal avec les fonctions, alors?

Modifier:
Un moyen de sortie de h2 se présente comme suit:

[0.5004899   0.45264441]
[0.50048522  0.47439413]
[0.50049019  0.46557124]
[0.50049261  0.45297816]

Donc, très semblable sigmoïde sorties pour tous les exemples de validation.

  • Une seule pensée, êtes-vous randomisation votre formation? Si il y a un tas de 0 classe dans la première lots, il est possible qu'il devient concentré sur eux, très tôt.
  • Les données sont commandés, c'est à dire: 10000 de 0s, puis 10000 de 1s.
  • Viens de réaliser que vous avez dit "batch". Je pense que j'étais prête à confusion avec le "mini-batch" lorsque cela est un problème commun. Il faudra que je pense à propos de ce peu plus.
  • Juste pour info: j'ai essayé de randomisation des données d'entrée et le résultat est toujours le même.
  • Essayer de retourner les premières h2 valeurs de votre finale predict appel. Sont-elles toutes les mêmes?
  • Oui, à environ 0.4/0.6.
  • Voir aussi: Pourquoi mon ICRA 100 CNN modèle, principalement prévoir deux classes?