CNN model not working well on 4 species but works well with 2 species

Mir*_*nib 0 python keras tensorflow

I tried CNN model on two classes and got 80% but when i tried the same model with 4 classes i got very bad result. What is the reason pls help. The model of CNN i used is:

model= Sequential()

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

model.add(Conv2D(64,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())

model.add(Dense(64))
model.add(Activation('relu'))

model.add(Dropout(0.5))

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

#opt = SGD( lr=0.01)

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

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples//batch_size,
    epochs=epochs,
    validation_data = validation_generator, 
    validation_steps = validation_generator.samples // batch_size,
)
Run Code Online (Sandbox Code Playgroud)

The result of 2 classes something like this i lost the actual result of it:

Epoch 29/35
46/46 [==============================] - 188s 4s/step - loss: 0.6511 - accuracy: 0.5880 - val_loss: 0.7534 - val_accuracy: 0.5175


Run Code Online (Sandbox Code Playgroud)

The result with 4 classes is:

46/46 [==============================] - 367s 8s/step - loss: -10550614391401.7266 - accuracy: 0.2541 - val_loss: -15023441182720.0000 - val_accuracy: 0.2354
Run Code Online (Sandbox Code Playgroud)

San*_*San 5

输出层使用sigmoid激活函数,只能用于二分类问题。

对于两个以上的类,softmax在它应该有num_of_classes节点之前使用激活函数和密集层。

model.add(Dense(numclasses)) # numclasses = 4 in your case
model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

此外,损失应该从 更改binary_crossentropycategorical_crossentropy(这是在您的情况下显示奇怪损失的主要原因)。

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

注意: categorical_crossentropy需要one-hot向量。如果您拥有的标签只是一维数组而不是单热向量,请使用sparse_categorical_crossentropy

  • 抱歉,我以为你的输出将是一个热向量...将“categorical_crossentropy”更改为“sparse_categorical_crossentropy” (2认同)