图像分类任务,训练精度一直很高,验证精度就低得离谱,降低模型复杂度,加上Dropout还是没起作用,检查了数据集的标签啥的也没有错,用预训练模型检查了下,发现还是有错误
```python
import keras
import pandas as pd
from keras_preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from pathlib import Path
import os.path
from keras import layers
TARGET_SIZE = (224,224)
BATCH_SIZE = 32
dataset = "./train"
image_dir = Path(dataset)
filepaths = list(image_dir.glob(r'**/*.jpg'))
labels = list(map(lambda x: os.path.split(os.path.split(x)[0])[1], filepaths))
filepaths = pd.Series(filepaths, name='Filepath').astype(str)
labels = pd.Series(labels, name='Label') # 得到路径对应标签
train_df = pd.concat([filepaths, labels], axis=1)
train_generator = ImageDataGenerator(
rescale=1./255,
validation_split=0.2
)
train_images = train_generator.flow_from_dataframe(
dataframe=train_df,
x_col='Filepath',
y_col='Label',
target_size=TARGET_SIZE,
color_mode='rgb',
class_mode='categorical',
batch_size=BATCH_SIZE,
shuffle=True,
seed=42,
subset='training'
)
val_images = train_generator.flow_from_dataframe(
dataframe=train_df,
x_col='Filepath',
y_col='Label',
target_size=TARGET_SIZE,
color_mode='rgb',
class_mode='categorical',
batch_size=BATCH_SIZE,
shuffle=True,
seed=42,
subset='validation'
)
model = keras.Sequential([
layers.Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(224, 224, 3)),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(16, kernel_size=(3, 3), activation='relu'),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dense(32, activation='relu'),
layers.Dense(25, activation='softmax')
])
model.compile(
optimizer=Adam(0.0001),
loss='categorical_crossentropy',
metrics=['accuracy']
)
history = model.fit(
train_images,
steps_per_epoch=len(train_images),
validation_data=val_images,
validation_steps=len(val_images),
epochs=10
)
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/49080867abcf496c9e92a77d429549ba.png "#left")
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/45257ae53dd14fdcb462751b6be7e467.png "#left")