검증 손실 및 정확도는 일정하게 유지


12

논문을 일련의 의료 이미지에 구현하려고합니다 . Keras에서하고 있습니다. 네트워크는 기본적으로 4 개의 conv 및 max-pool 레이어와 완전히 연결된 레이어 및 소프트 최대 분류기로 구성됩니다.

내가 아는 한,이 논문에서 언급 한 아키텍처를 따랐습니다. 그러나 유효성 검사 손실 및 정확도는 전체적으로 동일하게 유지됩니다. 정확도는 ~ 57.5 %로 고정 된 것으로 보입니다.

내가 잘못 가고있는 곳에서 도움을 주시면 대단히 감사하겠습니다.

내 코드 :

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)

훈련 손실이 줄어드는가?
Jan van der Vegt

아니요, 교육 손실도 전체적으로 일정하게 유지됩니다.
Raghuram

적합 통화에 유효성 검사 데이터 또는 validation_split을 설정하지 않았습니다. 어떤 데이터를 유효성 검사합니까? 아니면 테스트를 의미 했습니까?
Jan van der Vegt

그것은 실험 후입니다. None으로 설정하기 전에 validation_split = 0.2로 설정하고 그 주위를 실험했습니다.
Raghuram

2
훈련 손실을 줄일 수 있는지 확인하기 위해 한 번의 배치를 여러 번 맞출 수 있습니까?
Jan van der Vegt

답변:


4

그것은 당신이 손실 함수로 MSE를 사용하는 것처럼 보입니다. 논문에서 NLL (교차 엔트로피)을 사용하는 것처럼 보이고 MSE는 다른 문제 중 데이터 불균형에 민감한 것으로 간주되며 문제의 원인이 될 수 있습니다 경험, 나는 당신의 경우 categorical_crossentropy 손실을 사용하여 훈련을 시도합니다. 또한 0.01의 학습 속도가 너무 큰 것 같습니다.


2

여기에 조금 늦었지만 최근에 비슷한 문제를 해결하는 데 도움이되는 2 센트를 넣고 싶습니다. 내가 구한 것은 범주 간 엔트로피 손실 외에도 (0,1) 범위로 기능을 확장하는 것이 었습니다. 그럼에도 불구하고, 기능 스케일링은 기능이 서로 다른 메트릭스에 속하고 내 경우처럼 서로에 대해 더 많은 변형 (수십 배)을 갖는 경우에만 도움이된다는 것을 말할 가치가 있습니다. 또한 hinge최대 여백 분류 기가 일반적으로 피쳐 값 사이의 거리에 민감 하므로 손실을 사용하는 경우 스케일링이 실제로 유용 할 수 있습니다 . 이것이 미래의 방문객들에게 도움이 되길 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.