我正在使用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)
答案 0 :(得分:1)
根据这个问题How does keras define "accuracy" and "loss"?,您的“准确性”被定义为绝对准确性,这对您的问题毫无意义。
训练结束后,你的训练损失和验证损失之间会有10倍的差异,这表明过度拟合(很难说没有图表和一些例子)。
开始修复它:
在你的情况下,我会想象一个基于所需位置和预测位置之间距离的度量。这不是默认的事情,你必须自己实现它。
如果模特说它很完美,那就一定要怀疑。
答案 1 :(得分:0)
从你的问题中无法判断,但我会冒昧地猜测你的数据分裂的一些含义。
通常情况下,当一个人将一个人的数据分成两组以上时,就会使用除了其中一个以外的所有数据来训练一些参数或另一个参数。例如,第一个分割用于选择模型权重,第二个分割用于选择模型体系结构等。据推测,您正在使用“验证”培训某些。设置,否则你不会拥有它。因此,问题几乎肯定是过度拟合。通常情况下,您检测过度拟合的方式是模型在用于训练模型的数据(通常是除了一个单独的拆分之外的所有内容)的准确性上的差异,您称之为“培训”#39;和'验证'分裂,以及您的模型未触及的分割的准确性,您称之为“测试”'分裂。
所以,根据你的问题 - 评论"我假设如果验证准确度很高那么没有过度拟合,对吗?"。不可以。如果模型的准确性与您用于训练任何内容的任何数据之间的差异高于您的模型从未以任何形式或时尚方式触及的数据模型的准确性,然后你过度适应。你似乎就是这种情况。
OTOH,可能就是你没有改变你的数据。如果不仔细观察培训/测试管道,就无法分辨。