Keras(+ tensorflow)无法仅通过部分顺序进行预测

时间:2017-03-30 13:59:32

标签: tensorflow deep-learning keras

我现在正致力于使用Keras构建立体匹配网络,并将tensorflow作为后端。网络具有以下结构:

enter image description here

在训练整个网络后,我需要对其进行测试。但是,培训阶段和测试阶段完全不同。我必须将模型分成两部分。第一部分是CNN + Concatenate,只需要运行一次,而完全连接的部分(实际上我在测试时将其修改为完全转换形式)需要运行d次,输入稍有不同,其中d变化从100到228。

第一部分网络代码:

# input image dimensions
img_rows, img_cols = X1.shape[0], X1.shape[1]
input_shape = (img_rows, img_cols, 1)
X1 = X1.reshape(1, img_rows, img_cols, 1)
X2 = X2.reshape(1, img_rows, img_cols, 1)

# number of conv filters to use
nb_filters = 112

# CNN kernel size
kernel_size = (3,3)

left_branch = Sequential()
left_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same', input_shape=input_shape))
left_branch.add(Activation('relu'))
left_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
left_branch.add(Activation('relu'))
left_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
left_branch.add(Activation('relu'))
left_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
left_branch.add(Activation('relu'))

right_branch = Sequential()
right_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same', input_shape=input_shape))
right_branch.add(Activation('relu'))
right_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
right_branch.add(Activation('relu'))
right_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
right_branch.add(Activation('relu'))
right_branch.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='same'))
right_branch.add(Activation('relu')) 
merged = Merge([left_branch, right_branch], mode='concat')

cnn = Sequential()
cnn.add(merged)

我将从训练阶段获得的权重加载到网络的第一部分,并尝试对其进行预测。

def load_cnn_weights(filepath):
    f = h5py.File(filepath, mode='r')
    weights = []
    for i in range(1, 9):
        weights.append(f['model_weights/conv2d_{}/conv2d_{}/kernel:0'.format(i, i)][()])
        weights.append(f['model_weights/conv2d_{}/conv2d_{}/bias:0'.format(i, i)][()])
    f.close()
    return weights

weights = load_cnn_weights("/home/users/shixin.li/segment/Lecun_stereo_rebuild/weights.hdf5") 
cnn.set_weights(weights)
output_cnn = cnn.predict([X1, X2]) 

我已经检查了权重是否已成功读取,并且可以根据调用get_weights()函数进入网络。 X1和X2不为零,它们是归一化的灰度图像矩阵。我甚至尝试在预测之前编译网络。但结果output_cnn给出全零。

我没有看到有人遇到这个问题,我被困了两天。真正让我感到困惑的部分是输入和权重都不为零,那么为什么结果为零?如果你能提供帮助,我真的很感激!

1 个答案:

答案 0 :(得分:0)

您可能想尝试使用tfdbg来确切了解具有全零输出的op的输入,以尝试了解正在发生的事情。