Модель Keras классифицирует изображения как один и тот же класс

#tensorflow #keras #deep-learning #conv-neural-network

Вопрос:

Я использую предварительно обученную VGGNet16 Keras в качестве базовой модели, но мне нужно добавить слои на конце, чтобы она работала с моими данными. У меня есть данные, предварительно обработанные и отформатированные, поэтому я перейду к той части кода, которая действительно связана с CNN.

 import tensorflow as tf
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, AveragePooling2D
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import tensorflow.keras as K
.
.
.
input_t = K.Input(shape=(224,224,3))

base_model = K.applications.VGG16(include_top=False,weights="imagenet",input_tensor=input_t)

for layer in base_model.layers:
    layer.trainable = False

model = K.models.Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(num_classes,activation='softmax'))

#Training
model.compile(loss = 'binary_crossentropy',
                optimizer = Adam(learning_rate=1e-5),
                metrics = ['accuracy'])

#Fit
model.fit(x_train,
          y_train,
          epochs = 3,
          validation_split = 0.1,
          validation_data =(x_test,y_test))

model.summary()
 

Этот код выдает следующий вывод.

 Epoch 1/3
14/14 [==============================] - 48s 3s/step - loss: 0.5887 - accuracy: 0.2287 - val_loss: 0.4951 - val_accuracy: 0.3000
Epoch 2/3
14/14 [==============================] - 48s 3s/step - loss: 0.5170 - accuracy: 0.2220 - val_loss: 0.4972 - val_accuracy: 0.2800
Epoch 3/3
14/14 [==============================] - 48s 3s/step - loss: 0.4982 - accuracy: 0.2265 - val_loss: 0.4975 - val_accuracy: 0.2200
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Functional)           (None, 7, 7, 512)         14714688  
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
dense (Dense)                (None, 5)                 125445    
=================================================================
Total params: 14,840,133
Trainable params: 125,445
Non-trainable params: 14,714,688
_________________________________________________________________
Test loss: 0.4997282326221466
Test accuracy: 0.2720000147819519

 

Все мои тестовые изображения классифицируются в один и тот же класс. Есть ли для этого какая-то причина?

Изменить: Измененный вопрос после понимания того, что модель работает правильно

Комментарии:

1. Он уже обучается на модифицированной модели, а не на базовой модели.

2. @talos1904 Ах, поэтому я отредактировал свой вопрос так, чтобы он задавал другую проблему, которую я указал, что проблема не в самой модели. Я классифицирую все свои изображения по одному классу, и, похоже, это не меняется, даже когда я добавляю слои relu или изменяю скорость обучения.

3. Ну, это другой вопрос.. это может произойти по многим причинам. Во-первых, вам нужно понять, что вы тренируетесь только на уровне softmax. Может быть, добавить еще один слой перед этим и сделать его обучаемым. Также добавьте релу после этого. Это должно помочь в некотором улучшении.

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

5. @Dr. Snoopy Я тренировался в течение 50 эпох, и потеря все еще была около 0,49

Ответ №1:

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

 for layer in base_model.layers[:-6]:
    layer.trainable = False