CNN - Modelo prever todos da mesma classe

votos
0

Eu li algumas das outras respostas para um problema semelhante em stackoverflow, no entanto Eu não encontrei nada para me ajudar neste caso. I tem um conjunto de 539 imagens RGB, dimensões 607 x 607 x 3, e cada imagem é um de 6 classes. Tenho tido sucesso com os conjuntos de dados MNIST e CIFAR10, no entanto, quando eu crio CNNs para este conjunto de dados, o val_acc teste produziu quando o treinamento é constante restante / produzido por prever todas as mesmas classes (que pode variar). Abaixo eu ter incluído o meu código e um exemplo CNN, bem como a saída na GPU:

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

E a saída para os primeiros 9 épocas:

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

Eu tentei mudar o número de nós na camada oculta, criando modelos mais complicados, mudando funções de ativação, tudo o que eu posso pensar. Se eu fosse para executar o conjunto de dados CIFAR10 através deste (e alterar a última camada de densa (10) em vez de Dense (6)) I obter resultados bem sucedidos - não tenho certeza se há um problema com os dados que eu estou importando, no entanto, o np estrutura .shape para o meu dados é exatamente o mesmo que a estrutura np.shape para o conjunto de dados CIFAR10

Publicado 21/03/2016 em 17:03
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

val_acc não é constante, está saltando para trás e para frente. Tente diminuir a taxa de aprendizagem de 10 vezes, em seguida, 10 vezes novamente até que ele começa a aprender. Você terá que criar um objeto RMSProp e passar o objeto em vez de uma string.

Respondeu 21/03/2016 em 19:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more