如何可视化我的回归型CNN的输出?

时间:2019-07-28 11:26:40

标签: python tensorflow keras deep-learning

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

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

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


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


max_pooling2d_1(MaxPooling2(None,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(None,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(None,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(None,1,72,32)0


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


flatten_1(平坦)(无,2304)0


dropout_1(退出)(无,2304)0


dense_1(Dense)(None,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()

1 个答案:

答案 0 :(得分:1)

据我了解,模型的输出应表示尺寸为(11,1756)的图像像素的灰度值。

无需对特殊功能进行硬编码,只需在模型的输出上使用标准reshape()函数即可。

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

在创建矢量时,您可能已经在这样做了   训练期间使用的y_true参数(我认为   地面真理y_true变量的形状最初是(11,   1756),然后将其重塑为单列矢量形式)。