多类分类模型未正确训练。为什么训练损失不变?
Multiclass Classification model not training properly. Why is the training loss constant?
我正在尝试使用 keras 训练模型以进行多类分类。有 5 类 个可以预测。这是一个图像分类问题,如前所述,有五个 类 图像,卧室、浴室、客厅、餐厅和厨房。问题是模型似乎没有学习,它总是停留在 20% 的准确度,并且损失从第 1 阶段开始就没有变化。我使用的是 Xception 模型的卷积基,我的分类器在上面。使用 tf.data API.
设置训练、测试和验证数据集
有人可以指出我做错了什么吗?
这是数据集生成
train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"
train_ds = trainAug.flow_from_directory(
train_dir,
target_size=(224,224),
shuffle= False,
class_mode= "sparse"
)
valid_ds = image_dataset_from_directory(
valid_dir,
image_size=(224,224),
shuffle=False,
)
test_ds = image_dataset_from_directory(
test_dir,
image_size=(224,224),
shuffle=False,
)
这是异常卷积基的导入
conv_base = keras.applications.Xception(include_top=False, weights="imagenet", input_shape=(224,224,3))
conv_base.trainable = False
这是建模函数。
def pre_trained():
inputs = keras.Input(shape=(224,224,3))
#x = data_augmentation(inputs)
x = keras.applications.xception.preprocess_input(inputs)
x = conv_base(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.BatchNormalization()(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(5, activation = "softmax")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics = ["accuracy"])
return model
训练函数调用
history = pre_trained_model.fit(train_ds, epochs=25)
这是时代的写照。
试试我的 cnn 网络,看看你的准确率是否达到 87%。 cnn提取每一层的特征作为过滤器。过滤器然后馈送到类别 softmax 函数。
model=Sequential()
model.add(Conv2D(32, (3,3),activation='relu',input_shape=(IMG_SIZE,IMG_SIZE,3)))
#model.add(Dropout(0.25))
model.add(MaxPooling2D(2))
#model.add(BatchNormalization())
model.add(Conv2D(64, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
#model.add(BatchNormalization())
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
model.summary()
虽然我还不清楚具体的原因,但我已经找到了问题发生的地方,并找到了解决方法。
我在数据集生成器函数中添加了一些参数。
train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"
train_ds = image_dataset_from_directory(
train_dir,
image_size=(224,224),
shuffle= True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
valid_ds = image_dataset_from_directory(
valid_dir,
image_size=(224,224),
shuffle=True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
test_ds = image_dataset_from_directory(
test_dir,
image_size=(224,224),
shuffle=True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
我添加了使用一些种子进行随机播放的选项,并将标签模式更改为分类模式,这将生成标签的 one-hot 编码。同样,我也将损失从 sparse_categorical_crossentropy 更改为 categorical_crossentropy。这些变化使得模型可以训练,并且在训练和验证损失以及准确性方面都有显着改进。
我正在尝试使用 keras 训练模型以进行多类分类。有 5 类 个可以预测。这是一个图像分类问题,如前所述,有五个 类 图像,卧室、浴室、客厅、餐厅和厨房。问题是模型似乎没有学习,它总是停留在 20% 的准确度,并且损失从第 1 阶段开始就没有变化。我使用的是 Xception 模型的卷积基,我的分类器在上面。使用 tf.data API.
设置训练、测试和验证数据集有人可以指出我做错了什么吗?
这是数据集生成
train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"
train_ds = trainAug.flow_from_directory(
train_dir,
target_size=(224,224),
shuffle= False,
class_mode= "sparse"
)
valid_ds = image_dataset_from_directory(
valid_dir,
image_size=(224,224),
shuffle=False,
)
test_ds = image_dataset_from_directory(
test_dir,
image_size=(224,224),
shuffle=False,
)
这是异常卷积基的导入
conv_base = keras.applications.Xception(include_top=False, weights="imagenet", input_shape=(224,224,3))
conv_base.trainable = False
这是建模函数。
def pre_trained():
inputs = keras.Input(shape=(224,224,3))
#x = data_augmentation(inputs)
x = keras.applications.xception.preprocess_input(inputs)
x = conv_base(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.BatchNormalization()(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(5, activation = "softmax")(x)
model = keras.Model(inputs, outputs)
model.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics = ["accuracy"])
return model
训练函数调用
history = pre_trained_model.fit(train_ds, epochs=25)
这是时代的写照。
试试我的 cnn 网络,看看你的准确率是否达到 87%。 cnn提取每一层的特征作为过滤器。过滤器然后馈送到类别 softmax 函数。
model=Sequential()
model.add(Conv2D(32, (3,3),activation='relu',input_shape=(IMG_SIZE,IMG_SIZE,3)))
#model.add(Dropout(0.25))
model.add(MaxPooling2D(2))
#model.add(BatchNormalization())
model.add(Conv2D(64, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
model.add(Conv2D(128, (3,3), activation="relu"))
model.add(MaxPooling2D(2,2))
#model.add(BatchNormalization())
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
model.summary()
虽然我还不清楚具体的原因,但我已经找到了问题发生的地方,并找到了解决方法。
我在数据集生成器函数中添加了一些参数。
train_dir = "House_Dataset/Train"
valid_dir = "House_Dataset/Valid"
test_dir = "House_Dataset/Test"
train_ds = image_dataset_from_directory(
train_dir,
image_size=(224,224),
shuffle= True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
valid_ds = image_dataset_from_directory(
valid_dir,
image_size=(224,224),
shuffle=True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
test_ds = image_dataset_from_directory(
test_dir,
image_size=(224,224),
shuffle=True,
seed=1,
labels="inferred",
label_mode = "categorical"
)
我添加了使用一些种子进行随机播放的选项,并将标签模式更改为分类模式,这将生成标签的 one-hot 编码。同样,我也将损失从 sparse_categorical_crossentropy 更改为 categorical_crossentropy。这些变化使得模型可以训练,并且在训练和验证损失以及准确性方面都有显着改进。