Problème

J'essaie de classer certaines images 64x64 comme un exercice de boîte noire. Le NN que j'ai écrit ne change pas mon poids. La première fois que j'écris quelque chose comme ça, le même code, mais sur les lettres MNIST, l'entrée fonctionne très bien, mais sur ce code, elle ne s'entraîne pas comme elle le devrait :

import tensorflow as tf
import numpy as np


path = ""

# x is a holder for the 64x64 image
x = tf.placeholder(tf.float32, shape=[None, 4096])

# y_ is a 1 element vector, containing the predicted probability of the label
y_ = tf.placeholder(tf.float32, [None, 1])

# define weights and balances
W = tf.Variable(tf.zeros([4096, 1]))
b = tf.Variable(tf.zeros([1]))

# define our model
y = tf.nn.softmax(tf.matmul(x, W) + b)

# loss is cross entropy
cross_entropy = tf.reduce_mean(
                tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

# each training step in gradient decent we want to minimize cross entropy
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

train_labels = np.reshape(np.genfromtxt(path + "train_labels.csv", delimiter=',', skip_header=1), (14999, 1))
train_data = np.genfromtxt(path + "train_samples.csv", delimiter=',', skip_header=1)

# perform 150 training steps with each taking 100 train data
for i in range(0, 15000, 100):
    sess.run(train_step, feed_dict={x: train_data[i:i+100], y_: train_labels[i:i+100]})
    if i % 500 == 0:
        print(sess.run(cross_entropy, feed_dict={x: train_data[i:i+100], y_: train_labels[i:i+100]}))
        print(sess.run(b), sess.run(W))

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


sess.close()

Comment puis-je résoudre ce problème?

0
Samuel 18 mars 2019 à 06:31

2 réponses

Meilleure réponse

La clé du problème est que le numéro de classe de votre sortie y_ et y est 1. Vous devez adopter le mode one-hot lorsque vous utilisez tf.nn.softmax_cross_entropy_with_logits sur la classification problèmes de tensorflow. tf.nn.softmax_cross_entropy_with_logits calculera d'abord tf.nn.softmax. Lorsque votre numéro de classe est 1, vos résultats sont tous les mêmes. Par exemple:

import tensorflow as tf

y = tf.constant([[1],[0],[1]],dtype=tf.float32)
y_ = tf.constant([[1],[2],[3]],dtype=tf.float32)

softmax_var = tf.nn.softmax(logits=y_)
cross_entropy = tf.multiply(y, tf.log(softmax_var))

errors = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

with tf.Session() as sess:
    print(sess.run(softmax_var))
    print(sess.run(cross_entropy))
    print(sess.run(errors))

[[1.]
 [1.]
 [1.]]
[[0.]
 [0.]
 [0.]]
[0. 0. 0.]

Cela signifie que quelle que soit votre sortie y_, votre perte sera nulle. Vos weights et bias n'ont donc pas été mis à jour.

La solution est de modifier le numéro de classe de y_ et y.

Je suppose que votre numéro de classe est n.

Première approche : vous pouvez remplacer les données par one-hot avant les données de flux. Ensuite, utilisez le code suivant.

y_ = tf.placeholder(tf.float32, [None, n])
W = tf.Variable(tf.zeros([4096, n]))
b = tf.Variable(tf.zeros([n]))

Deuxième approche, changez les données en one-hot après les données d'alimentation.

y_ = tf.placeholder(tf.int32, [None, 1])
y_ = tf.one_hot(y_,n) # your dtype of y_ need to be tf.int32
W = tf.Variable(tf.zeros([4096, n]))
b = tf.Variable(tf.zeros([n]))
0
giser_yugang 18 mars 2019 à 10:43

Tous vos poids initiaux sont des zéros. Quand vous avez cette façon, le NN n'apprend pas bien. Vous devez initialiser tous les poids initiaux avec des valeurs aléatoires.

Voir Pourquoi les poids des réseaux neuronaux doivent-ils être initialisés à nombres aléatoires ?

"Pourquoi ne pas définir les poids sur zéro ? Nous pouvons utiliser le même ensemble de poids à chaque fois que nous formons le réseau ; par exemple, vous pouvez utiliser les valeurs de 0,0 pour tous les poids.

Dans ce cas, les équations de l'algorithme d'apprentissage n'apporteraient aucune modification aux poids du réseau et le modèle serait bloqué. Il est important de noter que le poids de biais dans chaque neurone est défini sur zéro par défaut, et non sur une petite valeur aléatoire. "

Voir https://machinelearningmastery.com/why-initialize-a -réseau-neural-avec-poids-aléatoires/

0
RebornCodeLover 18 mars 2019 à 05:58