我正在尝试使用FCN模型对城市景观图像进行分割。 我正在使用基本的8层NN。训练数据量非常高(最多90k张图像)。训练集最大为5k,有效集最大为2.5k图像。
为适应我的模型,我在使用adam Optimizer,
我要使用data_generator
来喂火车环。为了了解Train,我编写了一些Lambda-Callbacks,它们使用RGB-GT-Pred和ConfusionMatrix在Valid-Set上的每10个迭代中计算3x3子图。
图像数据的分辨率已大大降低(节省内存)。
在训练我的模型(大约55个历元->大约13小时)时,我的数据集Model-Accuracy Model-Loss上的损失将会增加或acc会减少。
在FCN体系结构中,没有Dropout。
在计算ConfusionMatrix和3x3子图时出现“负”峰值是非常可疑的。但是,在代码中进行大量搜索并没有找到原因。
对于混淆矩阵计算,我使用第二个data_generator
来加快进度。
每个人都可以给我提示如何解决此问题吗? 令人怀疑的是,Train-Set上的acc减少并且val_acc在同一时期增加??
请忽略过度拟合的问题。
这是我的data_generator:
def data_generator(data, labels, batch_size, input_dims, [...]):
batch_data = np.empty(shape = (batch_size, input_dims[0], input_dims[1], 3))
batch_labels = np.empty(shape = (batch_size, input_dims[0], input_dims[1], num_classes))
if shuffle:
indices = generate_shuffled_indices(len(data), batch_size)
else:
indices = generate_indices(len(data), batch_size)
[...]
While True:
for index, image in enumerate(batch_data_pil):
batch_data[index] = np.asarray(image, dtype = np.uint8)
yield batch_data, batch_labels
这是我的混淆矩阵计算:
def visualizeConfMatrix_2(X_val, Y_val, [...]):
rnd_idx = np.random.randint(0, len(Y_val), maxData)
X_val_red = np.ndarray([maxData, imageHeight, imageWidth, 3])
Y_val_red = np.ndarray([maxData, imageHeight, imageWidth, 1])
for i in range(0, len(rnd_idx)):
X_val_red[i] = X_val[i, :, :, :]
Y_val_red[i] = Y_val[i, :, :, :]
softmax_output = model.predict(X_val_red, batch_size = 1)
output = softmax_output.argmax(axis = -1).reshape(-1, 1)
label_images = Y_val_red.squeeze().reshape(-1, 1)
cnf_mat = confusion_matrix(label_images, output)
cnf_mat = cnf_mat.astype('float') / cnf_mat.sum(axis = 1)[:, np.newaxis]
plt.figure(figsize = (35, 25))
[...]