我正在研究一個 ResNet50 模型來預測胸部 X 光片中 Covid/非 Covid 的存在。但是,我的模型目前只預測類標簽 1...我嘗試了 3 種不同的優化器、2 種不同的損失函式,多次將學習率從 1e-6 更改為 0.5,并更改類標簽的權重...
有沒有人有任何想法可能是什么問題?為什么它總是預測類標簽 1?
這是代碼:
# import data
# train_ds = tf.keras.utils.image_dataset_from_directory(
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
DATASET_PATH "Covid/",
labels="inferred",
batch_size=64,
image_size=(256, 256),
shuffle=True,
seed=COVID_SEED,
validation_split=0.2,
subset="training",
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
DATASET_PATH "Covid/",
labels="inferred",
batch_size=64,
image_size=(256, 256),
shuffle=True,
seed=COVID_SEED,
validation_split=0.2,
subset="validation",
)
# split data
train_X = list()
train_y = list()
test_X = list()
test_y = list()
for image_batch_train, labels_batch_train in train_ds:
for index in range(0, len(image_batch_train)):
train_X.append(image_batch_train[index])
train_y.append(labels_batch_train[index])
for image_batch, labels_batch in val_ds:
for index in range(0, len(image_batch)):
test_X.append(image_batch[index])
test_y.append(labels_batch[index])
Conv_Base = ResNet50(weights=None, input_shape=(256, 256, 3), classes=2)
# The Convolutional Base of the Pre-Trained Model will be added as a Layer in this Model
for layer in Conv_Base.layers[:-8]:
layer.trainable = False
model = Sequential()
model.add(Conv_Base)
model.add(Flatten())
model.add(Dense(units = 1024, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(units = 1, activation = 'sigmoid'))
model.summary()
opt = Adadelta(learning_rate=0.3)
model.compile(optimizer = opt, loss = 'BinaryCrossentropy', metrics = ['accuracy'])
# try to add class weights to make it predict 0, since we currently only predict class label 1
class_weight = {0: 50.,
1: 1.}
r=model.fit(x = train_ds, validation_data = val_ds, epochs = COVID_EPOCHS, class_weight=class_weight)
#print the class labels of prediction
predictions = model.predict(val_ds)
predictions = np.ndarray.flatten(predictions)
predictions = np.where(predictions < 0, 0, 1) # Convert to 0 and 1.
np.set_printoptions(threshold=np.inf)
print(predictions)
uj5u.com熱心網友回復:
做得好!我也會在這里留下一個答案,因為我認為除了規范化之外,您還需要做更多的事情。
當權重為None(見這里)時,resnet 權重是隨機的。您正在使用大型卷積特征提取器(Resnet 的第一層),但該提取器未接受任何訓練。您可能會獲得不錯的性能,因為成功的 Dense 層會補償這種隨機初始化,但很可能這不是您的目標。請記住,您的 resnet 權重不可訓練,因此特征提取永遠不會改變。
我建議使用 imagenet 權重的原因是因為您正在處理影像,因此可以合理地假設您的卷積特征提取器需要提取重要的影像特征,例如顏色、形狀、邊緣等。 imagenet resnet 在 1000類左右無關,因為您在它到達輸出層之前將其切斷,這是出現類數瓶頸的地方。我會追求 weights = 'imagenet' 的東西。
uj5u.com熱心網友回復:
替換這一行:
model.add(Dense(units = 1, activation = 'sigmoid'))
從這個(如果你有二進制類):
model.add(Dense(units = 2, activation = 'sigmoid'))
否則使用此行(對于多個類):
model.add(Dense(units = len(classes), activation = 'softmax'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/368273.html
