Потеря прилипания и точность ниже 0,01 даже после настройки плотности, активации и количества слоев - PullRequest
0 голосов
/ 14 июня 2019

Как указано в заголовке, я не знаю, как построить оптимальную модель для распознавания видов собак.

Я пробовал различные методы, такие как удаление слоя, изменение значения плотности, добавление скорости обучения, добавлениескорость затухания, даже смена оптимизатора, но безрезультатно

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Activation, Flatten, Conv2D, MaxPooling2D

#print(X)
# print(y)
model = Sequential()

# METHOD TWO(Works but not accurate, built by self)
model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation("relu"))

model.add(Conv2D(128,(3,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation("relu"))

model.add(Flatten())
model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("softmax"))
model.add(Dense(120))

opt = tf.keras.optimizers.Adam()
model.compile(optimizer = opt,
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

# from tfkeras.utils import to_categorical
# y_binary = tf.keras.utils.to_categorical(y)
# y_binary = to_categorical(y)

model.fit(X, y,epochs=2)

Epoch 1/2
20580/20580 [==============================] - 311s 15ms/sample - loss: 4.8735 - acc: 0.0084

Epoch 2/2
12448/20580 [=================>............] - ETA: 2:02 - loss: 4.7875 - acc: 0.0071

1 Ответ

4 голосов
/ 14 июня 2019

Здесь есть несколько вещей, которые не правы:

  • Сначала активируйте свой слой conv2d, прежде чем их объединить!->
model.add(Conv2D(128, (3, 3), input_shape=X.shape[1:], activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))

или

model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
  • Во-вторых, вам нужно активировать softmax после последнего слоя, а не раньше!Softmax используется для вычисления вероятности для каждого нейрона вашего последнего слоя, вам нужно это:
model.add(Dense(120))
model.add(Activation("softmax"))
  • В-третьих, как сказал Матиас, 2 эпох совсем недостаточно, попробуйтечтобы увеличить это число!
  • Четвёртого, 2-го слоя для этой классификации недостаточно, увеличьте его и измените количество фильтров, чтобы зафиксировать различные особенности на изображении
    AОбщая архитектура сверточного блока может выглядеть следующим образом:
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

Вы можете манипулировать этим типом блоков по своему усмотрению, пробовать несколько блоков с различным количеством фильтров и т. д.

  • В-пятых, у вас слишком много нейронов в вашей полностью подключенной сети для вашей проблемы, попробуйте более простую архитектуру, которая даст лучшие результаты за меньшее время:
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu')
model.add(Dense(128)(x)
model.add(Activation('relu'))
model.add(Dense(120))
model.add(Activation('softmax'))

Скажите мне в комментарии результатыэти изменения дали вам!

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