2016-03-21 4 views
0

Я прочитал некоторые другие ответы на аналогичную проблему в stackoverflow, однако я не нашел ничего, чтобы помочь мне в этом случае. У меня есть набор из 539 изображений RGB, размеры 607 x 607 x 3, и каждое изображение является одним из 6 классов. У меня был успех с наборами данных MNIST и CIFAR10, однако, когда я создаю CNN для этого набора данных, тест val_acc создается, когда обучение остается постоянным/производится путем прогнозирования всех тех же классов (которые могут отличаться). Ниже я включил мой код и пример CNN, а также выход на GPU:CNN - Модель, предсказывающая все тот же класс

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

И выход за первые 9 эпох:

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 

Я попытался изменить количество узлы в скрытом слое, создание более сложных моделей, изменение функций активации, все, что я могу придумать. Если бы мне пришлось запустить набор данных CIFAR10 через это (и изменить последний слой на Dense (10), а не на Dense (6)), я получаю успешные результаты. Не уверен, что есть проблема с импортируемыми мной данными, однако np .shape структура для моих данных точно такая же, как структура np.shape для набора данных CIFAR10

ответ

0

val_acc не является постоянным, он прыгает взад-вперед. Попробуйте снизить скорость обучения 10 раз, а затем 10 раз, пока она не начнет учиться. Вам нужно будет создать объект RMSProp и передать объект вместо строки.

+0

Это либо постоянный, либо прыжок между предсказаниями всех тех же классов - обратите внимание, как он прыгает между одними и теми же значениями - это точность предсказания всего одного класса по сравнению с предсказанием всего другого класса. Теперь посмотрим на объект RMSProp, однако я попробовал с sgd, используя гораздо более низкую скорость обучения и все еще не добился успеха. –

+0

Я запустил предложение с частотой обучения в 1e-4, 1e-5 и 1e-6, и это не устранило проблему , –

Смежные вопросы