Модель не тренируется должным образом, точность постоянна во время обучения набора данных RGB - PullRequest
0 голосов
/ 14 декабря 2018

Я тренирую модель для набора данных fruits360 из kaggle.У меня 0 плотных слоев и 3 сверточных слоя в моей модели керас.Моя форма ввода (60,60,3), поскольку изображения загружаются в формате RGB.Пожалуйста, помогите мне разобраться, в чем проблема с этой моделью, почему она не тренируется должным образом.Я пробовал использовать разные комбинации слоев, но точность и потери остаются неизменными независимо от того, что вы меняете.

Ниже приводится модель:

dense_layers = [0]
layer_sizes = [64]
conv_layers = [3]

for dense_layer in dense_layers:
for layer_size in layer_sizes:
    for conv_layer in conv_layers:
        NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, dense_layer, int(time.time()))
        print(NAME)

        model = Sequential()

        model.add(Conv2D(layer_size, (3, 3), input_shape=(60, 60, 3)))
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))

        for l in range(conv_layer-1):
            model.add(Conv2D(layer_size, (3, 3)))
            model.add(Activation('relu'))
            model.add(MaxPooling2D(pool_size=(2, 2)))

        model.add(Flatten())

        for _ in range(dense_layer):
            model.add(Dense(layer_size))
            model.add(Activation('relu'))

        model.add(Dense(1))
        model.add(Activation('sigmoid'))

        tensorboard = TensorBoard(log_dir="logs/")

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

        model.fit(X_norm, y,
                  batch_size=32,
                  epochs=10,
                  validation_data=(X_norm_test,y_test),
                  callbacks=[tensorboard])

, но точность остается постоянной следующим образом:

Epoch 1/10
42798/42798 [==============================] - 27s 641us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 2/10
42798/42798 [==============================] - 27s 638us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 3/10
42798/42798 [==============================] - 27s 637us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 4/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 5/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 6/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 7/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 8/10
42798/42798 [==============================] - 27s 631us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 9/10
42798/42798 [==============================] - 27s 635us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114
Epoch 10/10
42798/42798 [==============================] - 27s 626us/step - loss: nan - acc: 0.0115 - val_loss: nan - val_acc: 0.0114

что я могу сделать, чтобы правильно обучить эту модель.Для повышения точности.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Ошибка с последним плотным слоем.Он установлен в один (т. Е. Один класс).Набор данных Fruits-360 (в зависимости от версии) имеет более 100 классов.Точность в 1% - это еще одна распродажа.Этикетки из обучающего набора имеют 100 различных значений.Плотный слой из одного выходного узла может только (случайным образом) получить его правильно 1 из 100 - отсюда 1%.

'sparse_categorical_crossentropy' в порядке, если метки не имеют горячего кодирования,Если это так, вы должны использовать 'categoryor_crossentropy'.Набор данных Fruits-360 при использовании с Адамом имеет тенденцию не сходиться при высоких скоростях обучения (например, 0,1 и 0,01), лучше всего устанавливать низкую скорость обучения на уровне от 0,001 до 0,0001.

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

Я не уверен, sparse_categorical_crossentropy - это правильная потеря для выхода только с 1 единицей.

Обратите внимание, что ваша потеря nan.Это означает, что в вашей модели / данных / потере где-то есть математическая ошибка.Во многих случаях это вызвано делением на ноль, переполнением чисел и т. Д.

Полагаю, вам следует использовать 'binary_crossentropy' в качестве функции потерь.

Обратите внимание, что у вас все еще будет риск замороженных потерь из-за активаций "relu".Если это произойдет, вы можете добавить BatchNormalization() слоев до слоев Activation('relu').


Пожалуйста, примите во внимание комментарии @ desertnaut.Вы создаете новую модель Sequential внутри каждого цикла.

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