【问题标题】:why is my model performing poorly for a keras sequential model?为什么我的模型在 keras 顺序模型中表现不佳?
【发布时间】:2020-10-03 20:53:16
【问题描述】:

我是深度学习(和机器学习)的新手,我创建了一个 Python 脚本,该脚本使用 TensorFlow/Keras 使用 this dataset 将花朵识别到不同的组中。这是我的代码:(我在 Kaggle 上这样做)

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import LabelEncoder
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.optimizers import Adam, SGD
from keras.utils import to_categorical
from keras.layers import Conv2D, Dropout, Dense, Flatten
import matplotlib.pyplot as plt
import cv2
import os

NUM_CLASSES = 5
IMG_SIZE = 150
DAISY = '../input/flowers-recognition/flowers/daisy'
DANDELION = '../input/flowers-recognition/flowers/dandelion'
ROSE = '../input/flowers-recognition/flowers/rose'
SUNFLOWER = '../input/flowers-recognition/flowers/sunflower'
TULIP = '../input/flowers-recognition/flowers/tulip'

x = []
y = []

def train_data_gen(DIR, ID):
    for img in os.listdir(DIR):
        try:
            path = DIR + '/' + img
            img = plt.imread(path)
            img = cv2.resize(img,(IMG_SIZE,IMG_SIZE))
            x.append(img)
            y.append(ID)
        except:
            None

train_data_gen(DAISY, 0)
train_data_gen(DANDELION, 1)
train_data_gen(ROSE, 2)
train_data_gen(SUNFLOWER, 3)
train_data_gen(TULIP, 4)

x = np.array(x)
y = to_categorical(y,num_classes = 5)

x_train,x_test,y_train,y_test = train_test_split(x, y, test_size = 0.15)
x_train,x_val,y_train,y_val = train_test_split(x_train, y_train, test_size = 0.15)

datagen = ImageDataGenerator(
    featurewise_center=False,
    samplewise_center=False,
    samplewise_std_normalization=False,
    rotation_range=60,
    zoom_range = 0.1,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    fill_mode = "reflect"
)

datagen.fit(x_train)

model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), strides=2, activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, 3)))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(5, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit_generator(datagen.flow(x_train,y_train,batch_size=16), epochs=10, steps_per_epoch=x_train.shape[0]//16, validation_data=(x_val, y_val), verbose=1)

我知道这里的 epochs 是 10,但后来,我将它设置为 100。这需要很长时间,所以我在第 63 个 epoch 停止了它。即便如此,它仍然浮动在 60% 左右,这太低了。我可以更改哪些内容以使其更准确?会不会是我的 CNN 太小了?还是我的数据有问题?我对此真的很陌生,所以除了“为什么我的模型表现不佳?”之外,我无法进一步说明我的问题。 提前感谢大家的建设性反馈。

【问题讨论】:

    标签: python machine-learning keras deep-learning neural-network


    【解决方案1】:

    您的模型使用了过多的 Dropout 层。 model.add(Dropout(0.5)) 有效地丢弃了你传入层的 50% 的神经元,除此之外,你还有 4 个这样的神经元。你很可能欠拟合

    在每个Conv2D 层之后添加一个keras.layers.MaxPooling2D 层。

    首先尝试移除所有 Dropout 层。在这种情况下,您将面临过度拟合的风险——但如果您没有过度拟合,那么就没有 Dropout 层的意义。如果您确实过拟合,请尝试仅使用 1 个具有 20% 丢失率的 dropout 层,然后逐渐将其增加到 50%,然后可能再添加一个 20% 的 dropout 并继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-05
      • 2020-11-30
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多