Ошибка со свёрточной нейронной сетью

Начал заниматься нейронными сетями и решил сделать свою архитектуру нс.

Вот мой код:

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

model = Sequential()
inputShape = (32, 32, 3)
chanDim = -1
    # CONV => RELU => BN => POOL
model.add(Conv2D(8, (5, 5), padding="same",
  input_shape=inputShape))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2, 2)))
  # first set of (CONV => RELU => CONV => RELU) * 2 => POOL
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2, 2)))
# second set of (CONV => RELU => CONV => RELU) * 2 => POOL
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(2, 2)))
  # first set of FC => RELU layers
model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# second set of FC => RELU layers
model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# softmax classifier
model.add(Dense(7))
model.add(Activation("softmax"))
# return the constructed network architecture
print ("End")

Выдает такую ошибку:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MaxU

Несколько комментариев к вашему коду:

после первого применения слоя Flatten() - нет смысла делать это снова после Dense слоёв:

# first set of FC => RELU layers
model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# second set of FC => RELU layers
### model.add(Flatten())  <--- эту строчку стоит убрать / закомментировать
model.add(Dense(128))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# softmax classifier
model.add(Dense(7))
model.add(Activation("softmax"))

далее если вы ожидаете в выходном слое более одного юнита и используете функцию активации "softmax", то в качестве функции ошибки/потери следует использовать "categorical_crossentropy".

"binary_crossentropy" - используется для случаев бинарной классификации вместе с функцией активации sigmoid в выходном слое.

поэтому модель следует компилировать так:

model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["acc"])
→ Ссылка