2016-03-21 11 views
0

Ich habe einige der anderen Antworten auf ein ähnliches Problem auf Stackoverflow gelesen, aber ich habe nichts gefunden, um mir in diesem Fall zu helfen. Ich habe einen Satz von 539 RGB-Bildern, Abmessungen 607 x 607 x 3, und jedes Bild ist eine von 6 Klassen. Ich hatte Erfolg mit den MNIST- und CIFAR10-Datensätzen, aber wenn ich CNNs für diesen Datensatz erstelle, bleibt der Test val_acc, der beim Training erzeugt wird, konstant/produziert durch Vorhersage aller Klassen (die variieren können). Im Folgenden werde ich meinen Code und ein Beispiel CNN aufgenommen haben, sowie die Ausgabe auf der GPU:CNN - Modell der gleichen Klasse

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])) 

und der Ausgang für die ersten neun Epochen:

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 

Ich habe versucht, die Anzahl der Veränderung Knoten in der versteckten Ebene, Erstellen komplizierterer Modelle, Ändern der Aktivierungsfunktionen, alles, was ich mir vorstellen kann. Wenn ich das CIFAR10-Dataset durch dieses ausführen würde (und das letzte Layer in Denses (10) anstelle von Denses (6) ändere), bekomme ich erfolgreiche Ergebnisse - Nicht sicher, ob es ein Problem mit den importierten Daten gibt, jedoch das np .shape-Struktur für meine Daten ist genau das gleiche wie die np.shape-Struktur für den CIFAR10-Datensatz

Antwort

0

val_acc ist nicht konstant, es springt vor und zurück. Versuchen Sie, die Lernrate 10 Mal und dann 10 Mal zu verringern, bis das Lernen beginnt. Sie müssen ein RMSProp-Objekt erstellen und das Objekt anstelle einer Zeichenfolge übergeben.

+0

Es ist entweder konstant oder springt zwischen Vorhersagen der gleichen Klassen - beachten Sie, wie es zwischen den gleichen Werten springt - das ist die Genauigkeit der Vorhersage aller einer Klasse, im Vergleich zur Vorhersage aller anderen Klassen. Ich werde jetzt das RMSProp Objekt betrachten, aber ich versuchte es mit sgd mit einer viel niedrigeren Lernrate und immer noch keinen Erfolg –

+0

Ich lief den Vorschlag mit Lernrate bei 1e-4, 1e-5 und 1e-6 und dies als nicht das Problem behoben . –