如何一起训练两个神经网络

数据挖掘 Python 喀拉斯 美国有线电视新闻网 卷积神经网络
2022-02-14 02:05:48

这可以被认为是我之前的问题“如何从卷积特征图制作感兴趣区域提议? ”的扩展。

网络 1:

我有一个多输入神经网络,它需要三种类型的输入:

屏幕截图:1280x800 2D 输入形状。

TextMaps:160x160x168 输入形状。

候选人:只是区域的边界框(在这种情况下不相关)。

如上面的问题所示,这是建筑的形象:

在此处输入图像描述

这是代码:

from keras.models import Model
from keras.layers import Input, Dense, Conv2D, ZeroPadding2D, MaxPooling2D, BatchNormalization, concatenate
from keras.activations import relu
from keras.initializers import RandomUniform, Constant, TruncatedNormal

#  Network 1, Layer 1
screenshot = Input(shape=(1280, 1280, 0),
                   dtype='float32',
                   name='screenshot')
# padded1 = ZeroPadding2D(padding=5, data_format=None)(screenshot)
conv1 = Conv2D(filters=96,
               kernel_size=11,
               strides=(4, 4),
               activation=relu,
               padding='same')(screenshot)
# conv1 = Conv2D(filters=96, kernel_size=11, strides=(4, 4), activation=relu, padding='same')(padded1)
pooling1 = MaxPooling2D(pool_size=(3, 3),
                        strides=(2, 2),
                        padding='same')(conv1)
normalized1 = BatchNormalization()(pooling1)  # https://stats.stackexchange.com/questions/145768/importance-of-local-response-normalization-in-cnn

# Network 1, Layer 2

# padded2 = ZeroPadding2D(padding=2, data_format=None)(normalized1)
conv2 = Conv2D(filters=256,
               kernel_size=5,
               activation=relu,
               padding='same')(normalized1)
# conv2 = Conv2D(filters=256, kernel_size=5, activation=relu, padding='same')(padded2)
normalized2 = BatchNormalization()(conv2)
# padded3 = ZeroPadding2D(padding=1, data_format=None)(normalized2)
conv3 = Conv2D(filters=384,
               kernel_size=3,
               activation=relu,
               padding='same',
               kernel_initializer=TruncatedNormal(stddev=0.01),
               bias_initializer=Constant(value=0.1))(normalized2)
# conv3 = Conv2D(filters=384, kernel_size=3, activation=relu, padding='same',
#               kernel_initializer=RandomUniform(stddev=0.1),
#               bias_initializer=Constant(value=0.1))(padded3)

# Network 2, Layer 1

textmaps = Input(shape=(160, 160, 128),
                 dtype='float32',
                 name='textmaps')
txt_conv1 = Conv2D(filters=48,
                   kernel_size=1,
                   activation=relu,
                   padding='same',
                   kernel_initializer=TruncatedNormal(stddev=0.01),
                   bias_initializer=Constant(value=0.1))(textmaps)

# (Network 1 + Network 2), Layer 1

merged = concatenate([conv3, txt_conv1], axis=-1)
merged_padding = ZeroPadding2D(padding=2, data_format=None)(merged)
merged_conv = Conv2D(filters=96,
                     kernel_size=5,
                     activation=relu, padding='same',
                     kernel_initializer=TruncatedNormal(stddev=0.01),
                     bias_initializer=Constant(value=0.1))(merged_padding)

问题:

在我去Network 2之前,我已经提出了一个问题。

如上图所示,在架构的最后,我们有一个ROI MaxPool 层我使用了Faster R-CNN 提出的一种方法,该方法基于应该单独训练的区域提议网络。让我们将区域提议网络称为Network 2

但是问题来了,为了训练我的Network 1,我需要训练Network 2,但是为了训练Network 2,我需要训练一个Network 1

有没有办法解决这个问题?

附言

网络 2只不过是一个具有2 个卷积层和 1 个线性层的网络,它基于网络 1给出的特征图。但它必须通过特殊函数转换为区域提议,因此必须在训练期间对其进行评估(但我不能只传递一个空的形状信息,它需要一个实际的特征图)。

如果有任何方法可以解决这个问题,将不胜感激。

谢谢!

0个回答
没有发现任何回复~