Je suis un débutant à l'apprentissage automatique et c'est l'une des premières tâches de ML réelles mises au défi.Comment trouver si un ensemble de données peut entraîner un réseau de neurones?
Certaines données expérimentales contiennent 512 fonctions booléennes indépendantes et un résultat booléen.
Il y a environ 1e6 enregistrements d'expériences réelles dans l'ensemble de données fourni.
Dans un exemple XOR classique, tous les 4 états possibles sur 4 sont nécessaires pour former NN. Dans mon cas, c'est seulement 2^(10-512) = 2^-505
qui est proche de zéro.
Je n'ai plus d'informations sur la nature des données, seulement ces (512 + 1) * 1e6
bits.
Essayé NN avec 1 couche cachée sur les données disponibles. La sortie du NN formé sur les échantillons, même à partir du jeu d'apprentissage, est toujours proche de 0, pas un seul proche de "1". Joué avec l'initialisation des poids, le taux d'apprentissage de descente de gradient.
Mon code utilisant tensorflow 1.3, Python 3. Extrait du modèle:
with tf.name_scope("Layer1"):
#W1 = tf.Variable(tf.random_uniform([512, innerN], minval=-2/512, maxval=2/512), name="Weights_1")
W1 = tf.Variable(tf.zeros([512, innerN]), name="Weights_1")
b1 = tf.Variable(tf.zeros([1]), name="Bias_1")
Out1 = tf.sigmoid(tf.matmul(x, W1) + b1)
with tf.name_scope("Layer2"):
W2 = tf.Variable(tf.random_uniform([innerN, 1], minval=-2/512, maxval=2/512), name="Weights_2")
#W2 = tf.Variable(tf.zeros([innerN, 1]), name="Weights_2")
b2 = tf.Variable(tf.zeros([1]), name="Bias_2")
y = tf.nn.sigmoid(tf.matmul(Out1, W2) + b2)
with tf.name_scope("Training"):
y_ = tf.placeholder(tf.float32, [None,1])
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(
labels = y_, logits = y)
)
train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)
with tf.name_scope("Testing"):
# Test trained model
correct_prediction = tf.equal(tf.round(y), tf.round(y_))
# ...
# Train
for step in range(500):
batch_xs, batch_ys = Datasets.train.next_batch(300, shuffle=False)
_, my_y, summary = sess.run([train_step, y, merged_summaries],
feed_dict={x: batch_xs, y_: batch_ys})
je soupçonne que deux cas:
- ma faute - mauvaise mise en œuvre NN, mauvaise architecture;
- mauvaises données. Par rapport à l'exemple XOR, des données d'apprentissage incomplètes entraîneraient un NN défaillant. Cependant, les exemples d'entraînement fournis à la NN formée sont supposés donner des prédictions correctes, n'est-ce pas?
Comment évaluer s'il est possible de former du tout sur les données fournies un réseau de neurones (un perceptron 2 couches) pour prévoir le résultat? Un cas d'ensemble acceptable serait l'exemple XOR. Opposé à un bruit aléatoire.
Je ne serais pas enclin à utiliser un réseau de neurones pour les données qui consistent uniquement en entrées booléennes. –
@GordonLinoff Quelle est la meilleure approche dans ce cas? – Serge
Je voudrais commencer avec un arbre de décision et passer rapidement aux forêts aléatoires. Selon la nature des données, vous pourriez avoir de la chance avec les SVM (selon la structure des données), mais je pense que les forêts aléatoires feraient probablement un meilleur travail. –