#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