Keras - incapaz de reduzir a perda de entre épocas

votos
4

Estou treinando convnet VGG-like (como no exemplo http://keras.io/examples/ ) com um conjunto de imagens. I converter imagens em matrizes e redimensioná-las usando scipy:

mapper = [] # list of photo ids
data = np.empty((NB_FILES, 3, 100, 100)).astype('float32')
i = 0
for f in onlyfiles[:NB_FILES]:
    img = load_img(mypath + f)
    a = img_to_array(img)

    a_resize = np.empty((3, 100, 100))
    a_resize[0,:,:] = sp.misc.imresize(a[0,:,:], (100,100)) / 255.0 # - 0.5
    a_resize[1,:,:] = sp.misc.imresize(a[1,:,:], (100,100)) / 255.0 # - 0.5
    a_resize[2,:,:] = sp.misc.imresize(a[2,:,:], (100,100)) / 255.0 # - 0.5

    photo_id = int(f.split('.')[0])
    mapper.append(photo_id)
    data[i, :, :, :] = a_resize; i += 1

Na última camada densa Eu tenho 2 neurônios e eu ativar com softmax. Aqui estão as últimas linhas:

model.add(Dense(2))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(data, target_matrix, batch_size=32, nb_epoch=2, verbose=1, show_accuracy=True, validation_split=0.2)

Eu não sou capaz de melhorar a reduzir a perda e cada época tem a mesma perda e a mesma precisão como o anterior. A perda na verdade sobe entre 1ª e 2ª época:

Train on 1600 samples, validate on 400 samples
Epoch 1/5
1600/1600 [==============================] - 23s - loss: 3.4371 - acc: 0.7744 - val_loss: 3.8280 - val_acc: 0.7625
Epoch 2/5
1600/1600 [==============================] - 23s - loss: 3.4855 - acc: 0.7837 - val_loss: 3.8280 - val_acc: 0.7625
Epoch 3/5
1600/1600 [==============================] - 23s - loss: 3.4855 - acc: 0.7837 - val_loss: 3.8280 - val_acc: 0.7625
Epoch 4/5
1600/1600 [==============================] - 23s - loss: 3.4855 - acc: 0.7837 - val_loss: 3.8280 - val_acc: 0.7625
Epoch 5/5
1600/1600 [==============================] - 23s - loss: 3.4855 - acc: 0.7837 - val_loss: 3.8280 - val_acc: 0.7625

O que estou fazendo de errado?

Publicado 24/02/2016 em 08:21
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Da minha experiência, isso geralmente acontece quando a taxa de aprendizagem é muito alto. A otimização não será capaz de encontrar uma minima e apenas "se virar".

A taxa ideal vai depender de seus dados e na arquitetura de sua rede.

(Como referência, que estou no momento executando um convnet com 8 camadas, de um tamanho de amostra semelhante ao seu, e a mesma falta de convergência pode ser observado até que reduziu a taxa de aprendizagem para 0,001)

Respondeu 27/05/2016 em 05:39
fonte usuário

votos
2

Minhas sugestões seria reduzir a taxa de aprendizagem, tente o aumento de dados.

código de aumento de dados:

print('Using real-time data augmentation.')

    # this will do preprocessing and realtime data augmentation
     datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=True,  # apply ZCA whitening
        rotation_range=90,  # randomly rotate images in the range (degrees, 0 to 180)
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images

    # compute quantities required for featurewise normalization
    # (std, mean, and principal components if ZCA whitening is applied)
     datagen.fit(X_train)

    # fit the model on the batches generated by datagen.flow()
     model.fit_generator(datagen.flow(X_train, Y_train,
                         batch_size=batch_size),
                         samples_per_epoch=X_train.shape[0],
                         nb_epoch=nb_epoch)
Respondeu 27/05/2016 em 10:30
fonte usuário

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