当训练和验证准确度为1.000但结果仍然很差时,这意味着什么?

时间:2018-03-16 22:27:16

标签: tensorflow deep-learning keras conv-neural-network backpropagation

我正在使用Keras进行地标检测 - 特别是在人体图片上定位身体部位。我收集了大约2,000个训练样本,并使用rmsprop w / mse loss功能。在训练我的CNN之后,我留下了loss: 3.1597e-04 - acc: 1.0000 - val_loss: 0.0032 - val_acc: 1.0000

我认为这意味着我的模型在测试数据上表现良好,但是,预测的点远离标记点。任何想法或帮助将不胜感激!

IMG_SIZE = 96
NUM_KEYPOINTS = 15
NUM_EPOCHS = 50
NUM_CHANNELS = 1

TESTING = True

def load(test=False):

    # load data from CSV file
    df = pd.read_csv(fname)

    # convert Image to numpy arrays
    df['Image'] = df['Image'].apply(lambda im: np.fromstring(im, sep=' '))
    df = df.dropna()    # drop rows with missing values

    X = np.vstack(df['Image'].values) / 255.    # scale pixel values to [0, 1]
    X = X.reshape(X.shape[0], IMG_SIZE, IMG_SIZE, NUM_CHANNELS)
    X = X.astype(np.float32)

    y = df[df.columns[:-1]].values
    y = (y - (IMG_SIZE / 2)) / (IMG_SIZE / 2)   # scale target coordinates to [-1, 1]
    X, y = shuffle(X, y, random_state=42)   # shuffle train data
    y = y.astype(np.float32)

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

    return X_train, X_test, y_train, y_test

def build_model():

    # construct the neural network
    model = Sequential()

    model.add(Conv2D(16, (3, 3), activation='relu', input_shape=(IMG_SIZE, IMG_SIZE, NUM_CHANNELS)))
    model.add(MaxPooling2D(2, 2))

    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(2, 2))

    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(2, 2))

    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(500, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(NUM_KEYPOINTS * 2))

    return model


if __name__ == '__main__':

    X_train, X_test, y_train, y_test = load(test=TESTING)

    model = build_model()

    sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(optimizer=sgd, loss='mse', metrics=['accuracy'])
    hist = model.fit(X_train, y_train, epochs=NUM_EPOCHS, verbose=1, validation_split=0.2)

    # save the model
    model.save_weights("/output/model_weights.h5")
    histFile = open("/output/training_history", "wb")
    pickle.dump(hist.history, histFile)

2 个答案:

答案 0 :(得分:1)

根据这个问题How does keras define "accuracy" and "loss"?,您的“准确性”被定义为绝对准确性,这对您的问题毫无意义。

训练结束后,你的训练损失和验证损失之间会有10倍的差异,这表明过度拟合(很难说没有图表和一些例子)。

开始修复它:

  • 使用在您的上下文中有意义的指标,并了解它的作用以及计算方式。
  • 随机举例说明指标非常好,哪里非常糟糕,并手动验证确实如此(否则您需要一个不同的指标)。

在你的情况下,我会想象一个基于所需位置和预测位置之间距离的度量。这不是默认的事情,你必须自己实现它。

如果模特说它很完美,那就一定要怀疑。

答案 1 :(得分:0)

从你的问题中无法判断,但我会冒昧地猜测你的数据分裂的一些含义。

通常情况下,当一个人将一个人的数据分成两组以上时,就会使用除了其中一个以外的所有数据来训练一些参数或另一个参数。例如,第一个分割用于选择模型权重,第二个分割用于选择模型体系结构等。据推测,您正在使用“验证”培训某些。设置,否则你不会拥有它。因此,问题几乎肯定是过度拟合。通常情况下,您检测过度拟合的方式是模型在用于训练模型的数据(通常是除了一个单独的拆分之外的所有内容)的准确性上的差异,您称之为“培训”#39;和'验证'分裂,以及您的模型未触及的分割的准确性,您称之为“测试”'分裂。

所以,根据你的问题 - 评论"我假设如果验证准确度很高那么没有过度拟合,对吗?"。不可以。如果模型的准确性与您用于训练任何内容的任何数据之间的差异高于您的模型从未以任何形式或时尚方式触及的数据模型的准确性,然后你过度适应。你似乎就是这种情况。

OTOH,可能就是你没有改变你的数据。如果不仔细观察培训/测试管道,就无法分辨。