首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >val_accuracy比训练精度高,与val_accuracy和train_accuracy相比,测试精度很低。

val_accuracy比训练精度高,与val_accuracy和train_accuracy相比,测试精度很低。
EN

Stack Overflow用户
提问于 2022-09-25 19:46:20
回答 1查看 55关注 0票数 2

我在训练CNN的模特,

  1. 培训data=687、验证data=102、测试data=79
  2. 验证精度高于训练精度
  3. ,测试精度与验证精度和训练损失相比都很低,而

则低于训练损失。

代码片段:

代码语言:javascript
复制
train_datagen = ImageDataGenerator(
                    rescale=1./255,
                    # rotation_range=30,
                    zoom_range=0.1,
                    horizontal_flip=True,
                    # vertical_flip=True,
                    # fill_mode='nearest',
                    validation_split=.15) # set validation split

val_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.15)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(height, width),
    batch_size=batch_size,
    class_mode='categorical',
    seed=13
    )

validation_generator = val_datagen.flow_from_directory(
    train_dir, # same directory as training data
    target_size=(height, width),
    batch_size=batch_size,
    class_mode='categorical',
    seed=13,
    subset='validation'
    )
model = Sequential()
model.add(Conv2D(16,3,padding="same", activation="relu", input_shape=(height, width, 3)))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

model.add(Conv2D(32,3,padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

model.add(Conv2D(32, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

# model.add(Conv2D(32, 3, padding="same", activation="relu", kernel_regularizer=l2(0.0001)))
# model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.4))

model.add(Conv2D(64, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same",))
# model.add(Dropout(0.2))

model.add(Conv2D(64, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

model.add(Conv2D(128, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

model.add(Conv2D(128, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))

model.add(Conv2D(256, 3, padding="same", activation="relu"))
model.add(AveragePooling2D(strides=(2,2), padding="same"))
# model.add(Dropout(0.2))


model.add(Flatten())
model.add(Dense(256,activation="relu"))
model.add(Dropout(.5))
# model.add(Dense(256,activation="relu"))
# model.add(Dropout(.5))
model.add(Dense(4, activation="softmax"))

model.summary()

Adam(learning_rate=0.0001, name='Adam')
model.compile(optimizer = 'Adam',loss = 'categorical_crossentropy',metrics = ['accuracy'])

为了解决这个问题,我做了几件事:

  • I没有在conv层之间使用删除层,
  • I缩短了训练较长时间的数据
  • 的范围(测试精度下降到62%,val_acc最终达到100%)。

造成这个问题的原因是什么,如何解决呢?如何在Python中显示高精度的测试图像?

EN

回答 1

Stack Overflow用户

发布于 2022-09-25 19:52:33

您需要在subset='training'中添加train_generator。现在,您正在对培训和验证数据进行培训。

代码语言:javascript
复制
train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(height, width),
    batch_size=batch_size,
    class_mode='categorical',
    seed=13,
    subset='training'
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73847410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档