Точность застряла на 50% керас

1

Код

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential,Model
from keras.layers import Dropout, Flatten, Dense,Input
from keras import applications
from keras.preprocessing import image
from keras import backend as K
K.set_image_dim_ordering('tf')


# dimensions of our images.
img_width, img_height = 150,150

top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'Cats and Dogs Dataset/train'
validation_data_dir = 'Cats and Dogs Dataset/validation'
nb_train_samples = 20000
nb_validation_samples = 5000
epochs = 50
batch_size = 16
input_tensor = Input(shape=(150,150,3))

base_model=applications.VGG16(include_top=False, weights='imagenet',input_tensor=input_tensor)
for layer in base_model.layers:
    layer.trainable = False

top_model=Sequential()
top_model.add(Flatten(input_shape=base_model.output_shape[1:]))
top_model.add(Dense(256,activation="relu"))
top_model.add(Dropout(0.5))
top_model.add(Dense(1,activation='softmax'))
top_model.load_weights(top_model_weights_path)
model = Model(inputs=base_model.input,outputs=top_model(base_model.output))


datagen = ImageDataGenerator(rescale=1. / 255)

train_data = datagen.flow_from_directory(train_data_dir,target_size=(img_width, img_height),batch_size=batch_size,classes=['dogs', 'cats'],class_mode="binary",shuffle=False)


validation_data = datagen.flow_from_directory(validation_data_dir,target_size=(img_width, img_height),classes=['dogs', 'cats'], batch_size=batch_size,class_mode="binary",shuffle=False)


model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])

model.fit_generator(train_data, steps_per_epoch=nb_train_samples//batch_size, epochs=epochs,validation_data=validation_data, shuffle=False,verbose=

Я применил классификатор изображений для набора данных кошек и собак (https://www.kaggle.com/c/dogs-vs-cats/data) с использованием keras (передача получена с использованием сети VGG16). Код работает без ошибок, но точность застряла на 0.0% в течение примерно половины эпохи, а после половины - с точностью до 50%. Я использую атом с водородом.

Изображение 174551

Изображение 174551

Как исправить это. Я действительно не думаю, что у меня есть проблема смещения с таким набором данных с VGG16 (хотя я относительно новичок в этом поле).

  • 0
    Измените размер последнего активационного слоя с 1 на 2.
Теги:
machine-learning
keras
conv-neural-network

1 ответ

3
Лучший ответ

Измените свою активацию на уровне вывода на сигмовидный

от

top_model.add(Dense(1,activation='softmax')) 

в

top_model.add(Dense(1,activation='sigmoid'))
  • 0
    Большое спасибо, это сработало. Я думал, что softmax был идентичен сигмоиду для бинарной классификации. ( stats.stackexchange.com/questions/233658/… ). Можете ли вы помочь мне понять, почему softmax не работает?
  • 3
    2D soft max эквивалентен 1D сигмовидной. Если вы хотите использовать softmax, вам нужно использовать Dense (2), так что фактически существует два класса, которые softmax может дифференцировать. Запуск Softmax по n логитам дает n чисел, сумма которых равна 1. Так что, если вы запускаете его в одном логите, вы всегда получаете 1.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню