Правильное построение модели на Керасе - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в нейронных сетях и Keras, и я хочу создать CNN, который предсказывает определенные значения изображения.(эти три значения определяют размер, длину и ширину размытия, нанесенного поверх изображения).Все 3 значения могут варьироваться от 0 до 1, и у меня большой набор данных.

Я не совсем уверен, как построить CNN, чтобы сделать это, хотя все коды прототипов, которые я построил до сих пор, дают мне предсказания формата [1.,0.,0.] вместо диапазонов от 0 до 1 для каждогозначение.Кроме того, несмотря на изменение количества эпох и значения затухания в оптимизаторе SGD, я не получаю никаких изменений в моей функции потерь.Можете ли вы сказать мне, где я иду не так?Вот что у меня пока есть:

images, labels = load_dataset("images")   # function that loads images
images = np.asarray(images) # images are flattened 424*424 arrays (grayscale)
labels = np.asarray(labels) # Lables are 3-arrays, each value is float from 0-1

# I won't write this part but here I split into train_imgs and test_imgs

model = keras.Sequential()
# explicitly define SGD so that I can change the decay rate
sgd = keras.optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.add(keras.layers.Dense(32, input_shape=(424*424,) ))
model.add(keras.layers.Activation('relu'))
model.add(keras.layers.Dense(3, activation='softmax'))

model.compile(loss='mean_squared_error',optimizer=sgd)
# note: I also tried defining a weighted binary crossentropy but it changed nothing

checkpoint_name = 'Weights-{epoch:03d}--{val_loss:.5f}.hdf5' 
checkpoint = ModelCheckpoint(checkpoint_name, monitor='val_loss', verbose = 0, save_best_only = True, mode ='auto')
callbacks_list = [checkpoint]

model.fit(train_imgs, train_labls, epochs=20, batch_size=32, validation_split = 0.2, callbacks=callbacks_list)

predictions = model.predict(test_imgs) # make predictions on same test set!

Теперь я знаю, что я пропускаю выпадающие слои, но я ХОЧУ, чтобы CNN перегрузил мои данные, на данный момент я просто хочу, чтобы он что-нибудь сделал.Когда я прогнозирую на одном и том же наборе изображений, я надеюсь, что получу точные результаты, не так ли?Я не совсем уверен, что мне не хватает.Спасибо за помощь!

1 Ответ

0 голосов
/ 12 декабря 2018

Прежде всего, замена 'softmax' на 'sigmoid'.

Сигмоид сделает три выхода в диапазоне от 0 до 1. Также обратите внимание, что softmax сделан для классификации.Он пытается максимизировать только одно из трех значений, и сумма трех всегда будет равна единице.

Во-вторых, если ваша потеря полностью заморожена, проблема может быть в 'relu' (у relu есть константанулевой регион, где нет градиента).Вы можете либо заменить 'relu 'другой вещью, такой как 'sigmoid' или 'tanh', либо вы также можете добавить слой BatchNormalization() перед переходом.

Как вариант для начинающих, явсегда предпочитайте использовать optimizer='adam', это очень часто намного быстрее, чем SGD, и вам не нужно сильно беспокоиться о скорости обучения (конечно, продвинутые модели и лучшие результаты могут потребовать корректировки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...