python - 如何可视化回归类型 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()
解决方案
据我了解,您的模型的输出应该代表具有尺寸(11,1756)的图像像素的灰度值。
不需要硬编码一个特殊的函数,你可以简单地在模型的输出上使用标准的 reshape() 函数。
images = y_pred.reshape((-1, 11, 1756))
在为训练期间使用的 y_true 参数创建向量时,您可能已经这样做了(我假设 Ground Truth y_true 变量的形状最初是 (11, 1756),并且您将其重塑为单列向量形式)。
推荐阅读
- amazon-web-services - 通知在 ASG 中运行的所有 EC2 实例
- python - 重启时无法在 crontab 中启动 python 脚本
- python - 如何在子图 x 轴上对值进行排序
- ios - React Native 应用程序中的 PhaseScriptExecution 错误
- html - 在 R 中导出 html 表并识别超链接
- mysql - 语句的意外开头(prod_id)
- javascript - 当用户对消息做出反应时,机器人会在 discord.js 中发送另一条消息
- laravel - Laravel 7 存储图像显示直接运行到浏览器 url 但无法处理我的代码
- android - VideoView 在类中的 setpath 的语法是什么?
- ffmpeg - 是否可以使用 MinGW 为 Windows 10 成功编译工作 ffmpeg 的临时修复?