2016-03-21 4 views
0

J'ai lu quelques-unes des autres réponses à un problème similaire sur stackoverflow, mais je n'ai rien trouvé pour m'aider dans ce cas. J'ai un ensemble de 539 images RVB, dimensions 607 x 607 x 3, et chaque image est l'une des 6 classes. J'ai eu du succès avec les jeux de données MNIST et CIFAR10, cependant lorsque je crée des CNN pour cet ensemble de données, le test val_acc produit quand l'entraînement reste constant/produit en prédisant toutes les mêmes classes (qui peuvent varier). Ci-dessous j'ai inclus mon code et un exemple CNN, ainsi que la sortie sur le GPU:CNN - Modèle prédisant la même classe

from __future__ import absolute_import 
from __future__ import print_function 
import cPickle 
import gzip 
import numpy as np 
import theano 
import theano.tensor as T 
from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation, Flatten 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.datasets import mnist 
from keras.optimizers import SGD, RMSprop 
from keras.utils import np_utils, generic_utils 
from theano.tensor.nnet import conv 
from theano.tensor.nnet import softmax 
from theano.tensor import shared_randomstreams 
from theano.tensor.signal import downsample 
from theano.tensor.nnet import sigmoid 
from theano.tensor import tanh 
import pylab as pl 
import matplotlib.cm as cm 
import os, struct 
from array import array as pyarray 
from numpy import append, array, int8, uint8, zeros,genfromtxt, matrix 
from matplotlib.pyplot import imshow 
from sklearn.cross_validation import train_test_split 
from random import randint 
import cv2 

# Setting up the Data 
A=539; 
l = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(1) + ".csv",delimiter=',')) 
l1 = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(2) + ".csv",delimiter=',')) 
d = cv2.imread('/home/silo1/ad2512/Histo_6/SI1.jpg') 
d1 = cv2.imread('/home/silo1/ad2512/Histo_6/SI2.jpg') 
all_data=[d,d1] 
labels=[l,l1] 
for i in range(A-2): 
    if((i+3)>A): 
     break 
    l = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(i+3) + ".csv",delimiter=',')) 
    d = cv2.imread("/home/silo1/ad2512/Histo_6/SI" + str(i+3) + ".jpg") 
    all_data.append(d) 
    labels.append(l) 

s = np.shape(all_data)[1] 
all_data = np.asarray(all_data) 
all_data = all_data.astype('float32') 
all_data = all_data.reshape(A,3,s,s) 
labels = np.asarray(labels) 
labels = labels.astype('int') 
labels = np_utils.to_categorical(labels) 


# Building Model 
model = Sequential() 
model.add(Convolution2D(32,3,3,init='uniform',border_mode='full',input_shape=(3,s,s))) 
model.add(Activation('tanh')) 
model.add(Convolution2D(32, 3, 3)) 
model.add(Activation('tanh')) 
model.add(MaxPooling2D(pool_size=(3, 2))) 
model.add(Dropout(0.25)) 
model.add(Convolution2D(64, 3, 3, border_mode='full')) 
model.add(Activation('tanh')) 
model.add(Convolution2D(64, 3, 3)) 
model.add(Activation('tanh')) 
model.add(MaxPooling2D(pool_size=(3, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(500)) 
model.add(Activation('tanh')) 
model.add(Dropout(0.25)) 
model.add(Dense(500)) 
model.add(Activation('tanh')) 
model.add(Dropout(0.25)) 
model.add(Dense(6)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer="RMSprop") 
model.fit(all_data[0:200], labels[0:200], batch_size=10, nb_epoch=15,verbose=1,show_accuracy=True,validation_data=(all_data[400:539], labels[400:539])) 

Et la sortie pour les 9 premiers époques:

Epoch 1/15 
200/200 [==============================] - 73s - loss: 2.6849 - acc: 0.2500 - val_loss: 1.6781 - val_acc: 0.3957 
Epoch 2/15 
200/200 [==============================] - 73s - loss: 2.0138 - acc: 0.1800 - val_loss: 2.1653 - val_acc: 0.2518 
Epoch 3/15 
200/200 [==============================] - 73s - loss: 1.8683 - acc: 0.2600 - val_loss: 1.7330 - val_acc: 0.2518 
Epoch 4/15 
200/200 [==============================] - 73s - loss: 1.8136 - acc: 0.2200 - val_loss: 2.1307 - val_acc: 0.1871 
Epoch 5/15 
200/200 [==============================] - 73s - loss: 1.7284 - acc: 0.2600 - val_loss: 1.6952 - val_acc: 0.2518 
Epoch 6/15 
200/200 [==============================] - 73s - loss: 1.7373 - acc: 0.2900 - val_loss: 1.6020 - val_acc: 0.2518 
Epoch 7/15 
200/200 [==============================] - 73s - loss: 1.6809 - acc: 0.3050 - val_loss: 1.6524 - val_acc: 0.2518 
Epoch 8/15 
200/200 [==============================] - 73s - loss: 1.7306 - acc: 0.3350 - val_loss: 1.7867 - val_acc: 0.1871 
Epoch 9/15 
200/200 [==============================] - 73s - loss: 1.7803 - acc: 0.2400 - val_loss: 1.8107 - val_acc: 0.2518 

J'ai essayé de changer le nombre de nœuds dans la couche cachée, créant des modèles plus compliqués, changeant les fonctions d'activation, tout ce que je peux penser. Si je devais exécuter l'ensemble de données CIFAR10 à travers cela (et changer la dernière couche en Dense (10) plutôt qu'en Dense (6)), j'obtiens des résultats positifs - Je ne sais pas s'il y a un problème avec les données que j'importe. La structure .shape pour mes données est exactement la même que la structure np.shape pour l'ensemble de données CIFAR10

Répondre

0

val_acc n'est pas constant, il saute d'avant en arrière. Essayez d'abaisser le taux d'apprentissage 10 fois puis 10 fois jusqu'à ce qu'il commence à apprendre. Vous devrez créer un objet RMSProp et passer l'objet au lieu d'une chaîne.

+0

Il est soit constant, ou en sautant entre les prédictions de toutes les mêmes classes - notez comment il saute entre les mêmes valeurs - c'est la précision de prédire toutes les classes, par rapport à prédire toutes les autres classes. Regardera l'objet RMSProp maintenant, mais j'ai essayé avec sgd en utilisant un taux d'apprentissage beaucoup plus faible et toujours pas de succès –

+0

J'ai couru la suggestion avec le taux d'apprentissage à 1e-4, 1e-5 et 1e-6 et cela n'a pas résolu le problème . –