1

Ceci est un réseau discriminant que je m'entraîne pour pouvoir l'utiliser dans un réseau génératif. Je me suis entraîné sur un jeu de données avec 2 fonctions et fait la classification binaire. 1 = méditer 0 = ne pas méditer. (l'ensemble de données provient de l'une des vidéos de siraj raval).tensorflow: la couche de sortie affiche toujours [1.]

Pour certaines raisons, la couche de sortie (ol) sort toujours [1] dans chaque cas de test.

Mon jeu de données: https://drive.google.com/open?id=0B5DaSp-aTU-KSmZtVmFoc0hRa3c

import pandas as pd 
import tensorflow as tf 

data = pd.read_csv("E:/workspace_py/datasets/simdata/linear_data_train.csv") 
data_f = data.drop("lbl", axis = 1) 
data_l = data.drop(["f1", "f2"], axis = 1) 

learning_rate = 0.01 
batch_size = 1 
n_epochs = 30 
n_examples = 999 # This is highly unsatisfying >:3 
n_iteration = int(n_examples/batch_size) 


features = tf.placeholder('float', [None, 2], name='features_placeholder') 
labels = tf.placeholder('float', [None, 1], name = 'labels_placeholder') 

weights = { 
      'ol': tf.Variable(tf.random_normal([2, 1], stddev= -12), name = 'w_ol') 
} 

biases = { 
      'ol': tf.Variable(tf.random_normal([1], stddev=-12), name = 'b_ol') 
} 

ol = tf.nn.sigmoid(tf.add(tf.matmul(features, weights['ol']), biases['ol']), name = 'ol') 

loss = -tf.reduce_sum(labels*tf.log(ol), name = 'loss') # cross entropy 
train = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

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

for epoch in range(n_epochs): 
    ptr = 0 
    for iteration in range(n_iteration): 
     epoch_x = data_f[ptr: ptr + batch_size] 
     epoch_y = data_l[ptr: ptr + batch_size] 
     ptr = ptr + batch_size 

     _, err = sess.run([train, loss], feed_dict={features: epoch_x, labels:epoch_y}) 
    print("Loss @ epoch ", epoch, " = ", err) 

print("Testing...\n") 

data = pd.read_csv("E:/workspace_py/datasets/simdata/linear_data_eval.csv") 
test_data_l = data.drop(["f1", "f2"], axis = 1) 
test_data_f = data.drop("lbl", axis = 1) 
#vvvHERE  
print(sess.run(ol, feed_dict={features: test_data_f})) #<<<HERE 
#^^^HERE 
saver = tf.train.Saver() 
saver.save(sess, save_path="E:/workspace_py/saved_models/meditation_disciminative_model.ckpt") 
sess.close() 

sortie:

2017-10-11 00:49:47.453721: W C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. 
2017-10-11 00:49:47.454212: W C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations. 
2017-10-11 00:49:49.608862: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:955] Found device 0 with properties: 
name: GeForce GTX 960M 
major: 5 minor: 0 memoryClockRate (GHz) 1.176 
pciBusID 0000:01:00.0 
Total memory: 4.00GiB 
Free memory: 3.35GiB 
2017-10-11 00:49:49.609281: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:976] DMA: 0 
2017-10-11 00:49:49.609464: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:986] 0: Y 
2017-10-11 00:49:49.609659: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0) 
Loss @ epoch 0 = 0.000135789 
Loss @ epoch 1 = 4.16049e-05 
Loss @ epoch 2 = 1.84776e-05 
Loss @ epoch 3 = 9.41758e-06 
Loss @ epoch 4 = 5.24522e-06 
Loss @ epoch 5 = 2.98024e-06 
Loss @ epoch 6 = 1.66893e-06 
Loss @ epoch 7 = 1.07288e-06 
Loss @ epoch 8 = 5.96047e-07 
Loss @ epoch 9 = 3.57628e-07 
Loss @ epoch 10 = 2.38419e-07 
Loss @ epoch 11 = 1.19209e-07 
Loss @ epoch 12 = 1.19209e-07 
Loss @ epoch 13 = 1.19209e-07 
Loss @ epoch 14 = -0.0 
Loss @ epoch 15 = -0.0 
Loss @ epoch 16 = -0.0 
Loss @ epoch 17 = -0.0 
Loss @ epoch 18 = -0.0 
Loss @ epoch 19 = -0.0 
Loss @ epoch 20 = -0.0 
Loss @ epoch 21 = -0.0 
Loss @ epoch 22 = -0.0 
Loss @ epoch 23 = -0.0 
Loss @ epoch 24 = -0.0 
Loss @ epoch 25 = -0.0 
Loss @ epoch 26 = -0.0 
Loss @ epoch 27 = -0.0 
Loss @ epoch 28 = -0.0 
Loss @ epoch 29 = -0.0 
Testing... 

[[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.]] 
Saving model... 
[Finished in 57.9s] 

Répondre

1

problème principal

tout d'abord ce n'est pas valide la perte d'entropie croisée. L'équation que vous utilisez ne fonctionne qu'avec 2 sorties ou plus. Avec une seule sortie sigmoïde que vous devez faire

-tf.reduce_sum(labels*tf.log(ol) + (1-labels)*tf.log(1-ol), name = 'loss') 

sinon la solution est de répondre toujours « 1 » (ce qui se passe en ce moment).

Pourquoi? Notez que les étiquettes n'ont que 0 ou 1, et votre perte totale est une multiplication de l'étiquette et du logarithme de la prédiction. Par conséquent, lorsque true label est 0, votre perte est de 0, peu importe votre prédiction, car 0 * log (x) = 0, peu importe ce que x (tant que log (x) est défini). Par conséquent votre modèle est seulement pénalisé pour ne pas prédire "1" quand il le devrait, et ainsi il apprend à sortir 1 tout le temps.

D'autres choses bizarres

  1. Vous fournirez stddev négatif à la distribution normale, alors que vous ne devriez pas (à moins que cela est une fonctionnalité non documentée de random_normal, mais selon docs, il doit accepter un seul positif float, et vous devriez en fournir un petit nombre).

  2. Le calcul de l'entropie croisée comme celle-ci (d'une manière naïve) n'est pas numériquement stable, regardez tf.sigmoid_cross_entropy_with_logits. Vous ne permutez pas votre jeu de données, donc vous traitez toujours les données dans le même ordre, ce qui peut avoir de mauvaises conséquences (augmentation périodique de la perte, convergence plus difficile ou manque de convergence).