[英]Why is my resnet50 model in Keras not converging?
我目前正在嘗試對缺陷和非缺陷圖像中的集成電路進行分類。 我已經嘗試過 VGG16 和 InceptionV3 並且兩者都得到了非常好的結果(95% 的驗證准確率和低 val 損失)。 現在我想嘗試 resnet50,但我的 model 沒有收斂。 它的准確率也達到了 95%,但驗證損失不斷增加,而 val acc 卡在 50%。
到目前為止,這是我的腳本:
from keras.applications.resnet50 import ResNet50
from keras.optimizers import Adam
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D, Dropout
from keras import backend as K
from keras_preprocessing.image import ImageDataGenerator
import tensorflow as tf
class ResNet:
def __init__(self):
self.img_width, self.img_height = 224, 224 # Dimensions of cropped image
self.classes_num = 2 # Number of classifications
# Training configurations
self.epochs = 32
self.batch_size = 16 # Play with this to determine number of images to train on per epoch
self.lr = 0.0001
def build_model(self, train_path):
train_data_path = train_path
train_datagen = ImageDataGenerator(rescale=1. / 255, validation_split=0.25)
train_generator = train_datagen.flow_from_directory(
train_data_path,
target_size=(self.img_height, self.img_width),
color_mode="rgb",
batch_size=self.batch_size,
class_mode='categorical',
subset='training')
validation_generator = train_datagen.flow_from_directory(
train_data_path,
target_size=(self.img_height, self.img_width),
color_mode="rgb",
batch_size=self.batch_size,
class_mode='categorical',
subset='validation')
# create the base pre-trained model
base_model = ResNet50(weights='imagenet', include_top=False, input_shape= (self.img_height, self.img_width, 3))
# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(1024, activation='relu')(x)
#x = Dropout(0.3)(x)
# and a logistic layer -- let's say we have 200 classes
predictions = Dense(2, activation='softmax')(x)
# this is the model we will train
model = Model(inputs=base_model.input, outputs=predictions)
# first: train only the top layers (which were randomly initialized)
# i.e. freeze all convolutional InceptionV3 layers
for layer in base_model.layers:
layer.trainable = True
# compile the model (should be done *after* setting layers to non-trainable)
opt = Adam(self.lr) # , decay=self.INIT_LR / self.NUM_EPOCHS)
model.compile(opt, loss='binary_crossentropy', metrics=["accuracy"])
# train the model on the new data for a few epochs
from keras.callbacks import ModelCheckpoint, EarlyStopping
import matplotlib.pyplot as plt
checkpoint = ModelCheckpoint('resnetModel.h5', monitor='val_accuracy', verbose=1, save_best_only=True,
save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=16, verbose=1, mode='auto')
hist = model.fit_generator(steps_per_epoch=self.batch_size, generator=train_generator,
validation_data=validation_generator, validation_steps=self.batch_size, epochs=self.epochs,
callbacks=[checkpoint, early])
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title("model accuracy")
plt.ylabel("Accuracy")
plt.xlabel("Epoch")
plt.legend(["Accuracy", "Validation Accuracy", "loss", "Validation Loss"])
plt.show()
plt.figure(1)
import tensorflow as tf
if __name__ == '__main__':
x = ResNet()
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.compat.v1.Session(config=config)
x.build_model("C:/Users/but/Desktop/dataScratch/Train")
這是model的訓練
除了 vgg 和 inception 工作之外,resnet 失敗的原因可能是什么? 我的腳本有錯誤嗎?
至少對於代碼,我沒有看到任何可能影響訓練過程的錯誤。
# and a logistic layer -- let's say we have 200 classes
predictions = Dense(2, activation='softmax')(x)
這些台詞有點可疑。 但是好像評論里有錯別字,所以應該沒問題。
# first: train only the top layers (which were randomly initialized)
# i.e. freeze all convolutional InceptionV3 layers
for layer in base_model.layers:
layer.trainable = True
這些也很可疑。 如果你想凍結 ResNet-50 的層,你需要做的是
...
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(self.img_height, self.img_width, 3))
for layer in base_model.layers:
layer.trainable = False
...
但事實證明layer.trainable = True
實際上是你的意圖,所以也沒關系。
首先,如果您使用用於訓練 VGG16 和 Inception V3 的相同代碼,則代碼不太可能是問題所在。
為什么不檢查以下易感原因?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.