2017-09-22 6 views
2

Je travaille sur une voiture auto-conduite. Je veux prédire l'angle de braquage des images en utilisant un CNN dans tflearn. Le problème est qu'il ne sort que 0.1. Selon vous, quel est le problème? Les images sont 128x128 mais j'ai essayé de les redimensionner à 28x28 pour que je puisse utiliser le code de l'exemple mnist. Les lables sont des angles de braquage entre 0 et 180. Je peux aussi dire que la perte ne diminue pas quand on s'entraîne.Régression de sortie CNN dans tflearn

Training.py

import tflearn 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.estimator import regression 
import tflearn.datasets.mnist as mnist 
import numpy 
from scipy import misc 
import csv 

nrOfFiles = 0 
csv_list = [] 

with open('/Users/gustavoskarsson/Desktop/car/csvfile.csv', 'r') as f: 
    reader = csv.reader(f) 
    csv_list = list(reader) 

nrOfFiles = len(csv_list) 

pics = [] 
face = misc.face() 
for i in range(0, nrOfFiles): 
    face = misc.imread('/Users/gustavoskarsson/Desktop/car/pics/' + str(i) + '.jpg') 
    face = misc.imresize(face[:,:,0], (28, 28)) 
    pics.append(face) 

X = numpy.array(pics) 


steer = [] 
throt = [] 
for i in range(0, nrOfFiles): 
    steer.append(csv_list[i][1]) 
    throt.append(csv_list[i][2]) 

#y__ = numpy.array([steer, throt]) 
Y = numpy.array(steer) 
Y = Y.reshape(-1, 1) 
#Strunta i gasen till att börja med. 


convnet = input_data(shape=[None, 28, 28, 1], name='input') 

convnet = conv_2d(convnet, 32, 2, activation='relu') 
convnet = max_pool_2d(convnet, 2) 

convnet = conv_2d(convnet, 64, 2, activation='relu') 
convnet = max_pool_2d(convnet, 2) 

convnet = fully_connected(convnet, 1024, activation='relu') 
convnet = dropout(convnet, 0.8) 

convnet = fully_connected(convnet, 1, activation='softmax') 
convnet = regression(convnet, optimizer='adam', learning_rate=0.01, loss='mean_square', name='targets') 

model = tflearn.DNN(convnet) 
model.fit(X, Y, n_epoch=6, batch_size=10, show_metric=True) 
model.save('mod.model') 

Predict.py

import tflearn 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.estimator import regression 
import tflearn.datasets.mnist as mnist 
import numpy 
from scipy import misc 


convnet = input_data(shape=[None, 28, 28, 1], name='input') 
          #[none, 28, 28, 1] 

convnet = conv_2d(convnet, 32, 2, activation='relu') 
convnet = max_pool_2d(convnet, 2) 

convnet = conv_2d(convnet, 64, 2, activation='relu') 
convnet = max_pool_2d(convnet, 2) 

convnet = fully_connected(convnet, 1024, activation='relu') 
convnet = dropout(convnet, 0.8) 

convnet = fully_connected(convnet, 1, activation='softmax') 
convnet = regression(convnet, optimizer='adam', learning_rate=0.01, loss='mean_square', name='targets') 

model = tflearn.DNN(convnet) 
model.load('mod.model') 

#load test image 
face = misc.face() 
pics = [] 
for i in range(0, 3): 
    face = misc.imread('/Users/gustavoskarsson/Desktop/car/pics/' + str(i) + '.jpg') 
    face = misc.imresize(face[:,:,0], (28, 28)) 
    pics.append(face) 

test_x = numpy.array(pics) 
test_x = test_x.reshape([-1, 28, 28, 1]) 
print(model.predict([test_x[0]])) 

Répondre

1

Le problème est probablement dû à votre couche de sortie. Il utilise une fonction d'activation softmax, qui produit toujours des sorties de 0-1.

Si vous jetez un oeil à la softmax function definition, vous verrez que cela dépend de chaque noeud de sortie de votre couche. Comme vous n'avez qu'un seul noeud de sortie, il doit toujours retourner 1, puisque vous divisez la sortie par sa propre valeur. Si vous voulez en savoir plus sur les couches softmax, consultez Michael Nielsen's great free book on Neural Networks.

La fonction softmax n'est pas non plus un bon choix si vous n'essayez pas de classer les choses.

Essayez d'omettre le activation='softmax' dans votre dernier calque entièrement connecté.

+0

Merci, ce a résolu mon problème! –

+0

Content d'entendre ça! Veuillez approuver ma réponse pour faire savoir aux autres que votre problème est résolu. – openloop

1

Vous remplacez la variable convent qui a le réseau de convolution pour chaque couche. Aussi, vous devriez échantillonner dans chaque couche. Votre code devrait ressembler à:

x = tf.reshape(x, shape=[-1, 28, 28, 1]) 

    # Convolution Layer with 32 filters and a kernel size of 5 
    conv1 = tf.layers.conv2d(x, 32, 5, activation=tf.nn.relu) 

    # Max Pooling (down-sampling) with strides of 2 and kernel size of 2 
    conv1 = tf.layers.max_pooling2d(conv1, 2, 2) 

    # Convolution Layer with 64 filters and a kernel size of 3 
    conv2 = tf.layers.conv2d(conv1, 64, 3, activation=tf.nn.relu) 

    # Max Pooling (down-sampling) with strides of 2 and kernel size of 2 
    conv2 = tf.layers.max_pooling2d(conv2, 2, 2) 

Vous pouvez voir un here aussi

+0

Merci! C'était bon –

+0

@Gustav Oskarsson Vous devriez avoir les bonnes réponses et accepter la réponse qui a résolu votre problème –