Keras Layers无意中共享变量

时间:2018-04-16 18:37:59

标签: tensorflow deep-learning keras conv-neural-network batch-normalization

我正在构建一个CNN模型,该模型接收两个数据源:(1)1D激光雷达数据,以及(2)RGB图像。为了结合这两个来源,我做了以下几点。首先,我使用几个具有批量规范的卷积层从1D激光雷达数据中提取特征,例如......

    with tf.variable_scope("lidar_model"):
        base_model = OrderedDict()
        base_model['input'] = Input(shape=(input_size, 1))
        base_model['conv_1'] = Conv1D(filters=64, kernel_size=7, strides=3, padding='valid', activation=None)(base_model['input'])
        base_model['batch_norm_1'] = BatchNormalization()(base_model['conv_1'])
        base_model['activation_1'] = Activation(activation='relu')(base_model['batch_norm_1'])  

        base_model['max_pool_1'] = MaxPooling1D(pool_size=3, padding='same')(base_model['activation_1'])

        base_model['conv_2'] = Conv1D(filters=64, kernel_size=3, strides=1, padding='same', activation=None)(base_model['max_pool_1'])
        base_model['batch_norm_2'] = BatchNormalization()(base_model['conv_2'])
        base_model['activation_2'] = Activation(activation='relu')(base_model['batch_norm_2'])

我还使用ResNet50从图像中提取特征:

   with tf.variable_scope("image_model"):    
        feature_extractor = ResNet50(weights='imagenet', include_top=False, input_shape=img_shape, pooling='max')

最后,我通过连接上面两个模型的输出来组合这些特征,并通过几个密集层。

我的问题如下。在张量板中可视化我的模型,似乎激光雷达模型中的卷积批量标准化层与ResNet模型共享变量。例如,激光雷达批处理规范图层中的 gamma beta moving_mean moving_variance 变量将输出到ResNet模型。来自激光雷达卷积层的内核偏差也会传递给ResNet模型。目前尚不清楚这些张量的确切位置,但是一组激光雷达模型张量似乎正在进入ResNet内的所有批量标准化层。

以下是相关图片:

Two Models Sharing Variables 您将看到从激光雷达模型(base_scan_model)到图像模型(rendered_pa​​th_model)共享张量。

Batch Norm and Conv Layers in Lidar Model 你会看到几个错误的东西。 (1)批量规范层相互共享变量并输出到ResNet,(2)转换层也输出到ResNet。

ResNet Example Error 您将看到来自激光雷达模型的张量进入ResNet的批量范数层,这不应该是。

如何强制执行Keras / Tensorflow以保持两个模型分离,以便从激光雷达模型到ResNet不输出张量?使用tf.variable_scope()似乎无法实现这一点。

无论我使用tensorflow 1.2和keras 2.1.5,还是使用严格的tensorflow 1.7,我都会发现相同的错误。

0 个答案:

没有答案