Kehilangan validasi dan akurasi tetap konstan

12

Saya mencoba menerapkan makalah ini pada serangkaian gambar medis. Saya melakukannya di Keras. Jaringan pada dasarnya terdiri dari 4 lapisan conv dan max-pool diikuti oleh lapisan yang sepenuhnya terhubung dan classifier soft max.

Sejauh yang saya tahu, saya telah mengikuti arsitektur yang disebutkan di koran. Namun, validasi kehilangan dan akurasi tetap rata. Akurasi tampaknya diperbaiki pada ~ 57,5%.

Setiap bantuan di mana saya mungkin salah akan sangat dihargai.

Kode saya:

from keras.models import Sequential
from keras.layers import Activation, Dropout, Dense, Flatten  
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
from PIL import Image
import numpy as np
from sklearn.utils import shuffle
from sklearn.cross_validation import train_test_split
import theano
import os
import glob as glob
import cv2
from matplotlib import pyplot as plt

nb_classes = 2
img_rows, img_cols = 100,100
img_channels = 3


#################### DATA DIRECTORY SETTING######################

data = '/home/raghuram/Desktop/data'
os.chdir(data)
file_list = os.listdir(data)
##################################################################

## Test lines
#I = cv2.imread(file_list[1000])
#print np.shape(I)
####
non_responder_file_list = glob.glob('0_*FLAIR_*.png')
responder_file_list = glob.glob('1_*FLAIR_*.png')
print len(non_responder_file_list),len(responder_file_list)

labels = np.ones((len(file_list)),dtype = int)
labels[0:len(non_responder_file_list)] = 0
immatrix = np.array([np.array(cv2.imread(data+'/'+image)).flatten() for image in file_list])
#img = immatrix[1000].reshape(100,100,3)
#plt.imshow(img,cmap = 'gray')


data,Label = shuffle(immatrix,labels, random_state=2)
train_data = [data,Label]
X,y = (train_data[0],train_data[1])
# Also need to look at how to preserve spatial extent in the conv network
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=4)
X_train = X_train.reshape(X_train.shape[0], 3, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 3, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train /= 255
X_test /= 255

Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

## First conv layer and its activation followed by the max-pool layer#
model.add(Convolution2D(16,5,5, border_mode = 'valid', subsample = (1,1), init = 'glorot_normal',input_shape = (3,100,100))) # Glorot normal is similar to Xavier initialization
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2),strides = None))
# Output is 48x48

print 'First layer setup'
###########################Second conv layer#################################
model.add(Convolution2D(32,3,3,border_mode = 'same', subsample = (1,1),init = 'glorot_normal'))
model.add(Activation('relu'))
model.add(Dropout(0.6))
model.add(MaxPooling2D(pool_size = (2,2),strides = None))
#############################################################################

print ' Second layer setup'
# Output is 2x24

##########################Third conv layer###################################
model.add(Convolution2D(64,3,3, border_mode = 'same', subsample = (1,1), init = 'glorot_normal'))
model.add(Activation('relu'))
model.add(Dropout(0.6))
model.add(MaxPooling2D(pool_size = (2,2),strides = None))
#############################################################################
# Output is 12x12

print ' Third layer setup'
###############################Fourth conv layer#############################
model.add(Convolution2D(128,3,3, border_mode = 'same', subsample = (1,1), init = 'glorot_normal'))
model.add(Activation('relu'))
model.add(Dropout(0.6))
model.add(MaxPooling2D(pool_size = (2,2),strides = None))
############################################################################# 

print 'Fourth layer setup'

# Output is 6x6x128
# Create the FC layer of size 128x6x6#
model.add(Flatten()) 
model.add(Dense(2,init = 'glorot_normal',input_dim = 128*6*6))
model.add(Dropout(0.6))
model.add(Activation('softmax'))

print 'Setting up fully connected layer'
print 'Now compiling the network'
sgd = SGD(lr=0.01, decay=1e-4, momentum=0.6, nesterov=True)
model.compile(loss = 'mse',optimizer = 'sgd', metrics=['accuracy'])

# Fit the network to the data#
print 'Network setup successfully. Now fitting the network to the data'
model. fit(X_train,Y_train,batch_size = 100, nb_epoch = 20, validation_split = None,verbose = 1)
print 'Testing'
loss,accuracy = model.evaluate(X_test,Y_test,batch_size = 32,verbose = 1)
print "Test fraction correct (Accuracy) = {:.2f}".format(accuracy)
Raghuram
sumber
Apakah kehilangan pelatihan turun?
Jan van der Vegt
Tidak, kehilangan pelatihan juga tetap konstan sepanjang.
Raghuram
Anda belum menetapkan data validasi atau validation_split dalam panggilan pas Anda, apa yang akan divalidasi? Atau maksud Anda tes?
Jan van der Vegt
Itu setelah bereksperimen di sekitar. Saya mengatur validation_split = 0,2 sebelum menyetelnya ke Tidak ada dan bereksperimen dengan itu juga.
Raghuram
2
Bisakah Anda muat satu batch untuk banyak waktu untuk melihat apakah Anda bisa kehilangan pelatihan menjadi lebih rendah?
Jan van der Vegt

Jawaban:

4

Tampaknya Anda menggunakan MSE sebagai fungsi kerugian, dari sekilas di atas kertas tampaknya mereka menggunakan NLL (cross entropy), MSE dianggap cenderung sensitif terhadap ketidakseimbangan data di antara masalah lain dan mungkin menjadi penyebab masalah yang Anda alami. pengalaman, saya akan mencoba pelatihan menggunakan lossateg_crossentropy dalam kasus Anda, apalagi tingkat belajar 0,01 tampaknya terlalu besar saya akan mencoba untuk bermain dengannya dan mencoba 0,001 atau bahkan 0,0001

koltun
sumber
2

Meskipun saya agak terlambat di sini, saya ingin memasukkan dua sen saya karena membantu saya memecahkan masalah yang sama baru-baru ini. Apa yang datang untuk menyelamatkan saya adalah scaling fitur ke dalam (0,1) kisaran selain kerugian lintas-entropi kategoris. Namun demikian, perlu dikatakan bahwa penskalaan fitur hanya membantu jika fitur-fitur tersebut memiliki metrik yang berbeda dan memiliki variasi yang jauh lebih banyak (berdasarkan urutan besarnya) relatif satu sama lain, seperti dalam kasus saya. Juga, penskalaan bisa sangat berguna jika seseorang menggunakan hingekerugian, karena pengklasifikasi max-margin umumnya sensitif terhadap jarak antara nilai-nilai fitur. Semoga ini bisa membantu beberapa pengunjung masa depan!

Saurav--
sumber