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
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 –
Ich lief den Vorschlag mit Lernrate bei 1e-4, 1e-5 und 1e-6 und dies als nicht das Problem behoben . –