2017-10-03 2 views
0

Je regarde ce réseau neuronal très basique de https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/. J'ai remplacé les données utilisées avec juste un tableau aléatoire de nombres et d'étiquettes aléatoires.Prédictions neuronales de base de base?

Je suppose que l'entrée est aléatoire, les prédictions devraient être autour de 0,50, plus ou moins un peu. Cependant, quand je fais cela, je reçois

[0.49525392, 0.49652839, 0.49729034, 0.49670222, 0.49342978, 0.49490061, 0.49570397, 0.4962129, 0.49774086, 0.49475089, 0.4958384, 0.49506786, 0.49696651, 0.49869373, 0.49537542, 0.49613148, 0.49636957, 0.49723724] 

qui est d'environ 0,50, mais ne dépasse jamais. Il le fait pour n'importe quelle graine aléatoire que j'utilise, donc ce n'est pas juste une coïncidence, non plus. Des explications pour ce comportement?

# Create first network with Keras 
from keras.models import Sequential 
from keras.layers import Dense 
import numpy as np 

np.random.seed(90) 

X_train = np.random.rand(18,61250) 
X_test = np.random.rand(18,61250) 
Y_train = np.array([0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 
    0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0,]) 
Y_test = np.array([1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 
    1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,]) 

_, input_size = X_train.shape 

# create model 
model = Sequential() 
model.add(Dense(12, input_dim=input_size, init='uniform', activation='relu')) 
model.add(Dense(8, init='uniform', activation='relu')) 
model.add(Dense(1, init='uniform', activation='sigmoid')) 

# Compile model 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 

# calculate predictions 
predictions = model.predict(X_test) 
preds = [x[0] for x in predictions] 
print(preds) 

# Fit the model 
model.fit(X_train, Y_train, epochs=100, batch_size=10, verbose=2, validation_data=(X_test,Y_test)) 

Répondre

2

Je ne sais pas si cela répond précisément à votre question, mais je jouais avec votre code et décidé d'essayer quelque chose. Vos données X est généré entre 0 et 1, donc j'ai essayé le générer entre 0 et 10. Ceci est un exemple de la prédiction résultant:

[0.53419214, 0.55088341, 0.53190422, 0.52382213, 0.53469753, 0.53098464, 
0.51968938, 0.53249627, 0.52852863, 0.52497149, 0.52816379, 0.5457474, 
0.52565753, 0.5276686, 0.52042121, 0.52128422, 0.52535951, 0.52730507] 

Comme vous pouvez le voir, il produit maintenant des résultats plus de 0,5. Puisque vous prédisez la sortie avant la formation, la prédiction se fera avec poids aléatoires. Se pourrait-il que le réseau ne s'est pas encore ajusté à la distribution du vecteur d'entrée?

Ce sont les prédictions après la formation:

[0.43440229, 0.48104468, 0.49194154, 0.4766106, 0.50065982, 0.47388917, 
0.51052755, 0.50618082, 0.48478326, 0.4846094, 0.50018799, 0.4800632, 
0.4181695, 0.48307362, 0.5063237, 0.50420266, 0.39, 0.44235682] 

Les prédictions sont maintenant plus ou moins équilibrée. J'obtiens ce type de sortie avec les deux distributions d'entrée. Je pense que c'est une question de réseau initialisé au hasard étant très dépendante de la distribution de vos données d'entrée. Après l'entraînement, il se normalise.

+0

Merci! J'ai remarqué que le filet était parfois supérieur à 50%, mais je me suis dit que je faisais quelque chose pour le faire pencher d'un côté. Faire des prédictions après l'entraînement a plus de sens. – quil