首页 > 解决方案 > 如何可视化回归类型 CNN 的输出?

问题描述

我正在运行基于样本数据集和相应标签的回归类型的 CNN,它输入和输出不同维度的图像(因此不是图像分割问题)。结果,我网络的最后一个密集层将标签的高度和宽度相乘。现在,我已经对网络进行了一段时间的训练,我想看看图像是什么样的,以便了解我的模型的好坏。是否有一个功能可以为我提供此选项,还是我必须对其进行硬编码?我该怎么做?下面附上了我的网络代码和网络摘要。

层(类型)输出形状参数#

conv2d_1 (Conv2D) (无, 54, 1755, 4) 20


activation_1(激活)(无,54、1755、4)0


max_pooling2d_1 (MaxPooling2 (无, 18, 585, 4) 0


batch_normalization_1 (批次 (无, 18, 585, 4) 16


conv2d_2 (Conv2D) (无, 17, 584, 8) 136


activation_2(激活)(无、17、584、8)0


max_pooling2d_2 (MaxPooling2 (无, 8, 292, 8) 0


batch_normalization_2 (批次 (无, 8, 292, 8) 32


conv2d_3 (Conv2D) (无, 7, 291, 16) 528


activation_3(激活)(无、7、291、16)0


max_pooling2d_3 (MaxPooling2 (无, 3, 145, 16) 0


batch_normalization_3 (批次 (无, 3, 145, 16) 64


conv2d_4 (Conv2D) (无, 2, 144, 32) 2080


activation_4(激活)(无、2、144、32)0


max_pooling2d_4 (MaxPooling2 (无, 1, 72, 32) 0


batch_normalization_4(批次(无,1、72、32)128


flatten_1(展平)(无,2304)0


dropout_1(辍学)(无,2304)0


dense_1(密集)(无,19316)44523380


activation_5(激活)(无,19316)0

==================================================== ================

总参数:44,526,384 可训练参数:44,526,264 不可训练参数:120


提前致谢!

def generator(data_arr, batch_size = 10):

num = len(data_arr) 
num = int(num/batch_size)

# Loop forever so the generator never terminates
while True: 

    for offset in range(0, num):

        batch_samples = (data_arr[offset*batch_size:(offset+1)*batch_size])

        samples = []
        labels = []

        for batch_sample in batch_samples:

            samples.append(batch_sample[0])
            labels.append((np.array(batch_sample[1].flatten())).transpose())

        X_ = np.array(samples)
        Y_ = np.array(labels)

        X_ = X_[:, :, :, newaxis]

        yield (X_, Y_)

# compile and train the model using the generator function
train_generator = generator(training_data, batch_size = 10)
validation_generator = generator(val_data, batch_size = 10)

model = Sequential()

model.add(Conv2D(4, (2, 2), input_shape = (55, 1756, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (3, 3)))
model.add(BatchNormalization())

model.add(Conv2D(8, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(16, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(BatchNormalization())

model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(BatchNormalization())

model.add(Flatten()) 
model.add(Dropout(0.3))
model.add(Dense(19316))
model.add(Activation('softmax'))

def nrmse(y_true, y_pred):
    return backend.sqrt(backend.mean(backend.square(y_pred - 
y_true)))/(2)

def rmse(y_true, y_pred):
    return backend.sqrt(backend.mean(backend.square(y_pred - y_true), 
axis=-1))

model.compile(loss = 'mean_squared_error',
             optimizer = 'adam',
             metrics = [rmse, nrmse])

model.summary()

标签: pythontensorflowkerasdeep-learning

解决方案


据我了解,您的模型的输出应该代表具有尺寸(11,1756)的图像像素的灰度值。

不需要硬编码一个特殊的函数,你可以简单地在模型的输出上使用标准的 reshape() 函数。

images = y_pred.reshape((-1, 11, 1756))

在为训练期间使用的 y_true 参数创建向量时,您可能已经这样做了(我假设 Ground Truth y_true 变量的形状最初是 (11, 1756),并且您将其重塑为单列向量形式)。


推荐阅读