如何绑定权重来训练同一模型的多个副本

时间:2019-07-12 18:30:26

标签: python keras keras-layer

我需要实现以下模型。

我必须对数据序列执行函数A和函数B。 使用神经网络来实现函数A,并将其输出输入到函数B(不是神经网络,而是使用模型函数API在Keras中实现),然后在函数B的输出处计算损失函数。

输入是复数的L个长度向量。我需要将其并行输入到同一网络(顺序)的L个副本中。一个网络获取一个元素的实数和虚数,并输出m个实数。

因此,所有L个网络将总共输出m L个实数。函数B将把这m个实数作为输入并计算输出。

这是我的大致计划,

model_inputs = keras.layers.Input(shape=(L,))

function_A_model = Sequential()
function_A_model.add(Dense(32, activation='relu'))
function_A_model.add(Dense(m))  # Output layer

function_A_inputs = [layers.Input(shape=(2,)) for i in range(L)]

function_A_outputs = []
for i in range(L):
    function_A_outputs = [function_A_outputs function_A_model(function_A_inputs[i]) ]

function_B_outputs = function_B(function_A_outputs)

我想使用Model功能API将其实现为更大的Model,它将采用如上所述的model_inputs和输出function_B_outputs。

我的问题是

  1. 我需要将model_inputs输入向量除以L形为2的输入向量。如何在层中完成此操作?还是可以有一个输入向量?

  2. 如何在同一个网络的L个副本中实现功能A(权重是相同的)

  3. 如何将m * L输出合并到一个输出向量,以便可以将其输入到函数B?

1 个答案:

答案 0 :(得分:1)

  

我的问题是,   我需要将model_inputs输入向量除以形状2的L个输入向量。如何在层中完成此操作?

您可以定义对输入进行切片的Lambda层。例如:

public class Fragment2 extends Fragment {
...

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        myViewModel = ViewModelProviders.of(this, ViewModelFactory.getInstance(getActivity().getApplication())).get(MyViewModel.class);

        ...
    }
}
  

或者输入向量可以吗?

您可以具有任意形状的张量,包括(N,M)形状。

例如,如果您声明的模型为:

example = Input(shape=(20,))
slice_0_4 = Lambda(lambda x: x[:, :4])(example)
slice_4_16 = Lambda(lambda x: x[:, 4:16])(example)
slice_16_20 = Lambda(lambda x: x[:, 16:])(example)

上面的密集层将应用于输入的所有20个时间步。密集层在时间步长之间共享权重。因此,相同的w矩阵将在所有时间步的所有批次中相乘,进行10x8矩阵乘法。

  

如何在同一网络的L个副本中实现功能A(权重并列)

我不确定我是否遵循您的问题。您可以让顶级模型拆分其输入,并使用输入的一部分来调用子模型。或者您可以使用一个模型,在包含额外维度的矩阵上执行相同的一组操作。

  

如何将m * L输出合并到一个输出向量,以便可以将其输入到函数B?

您可以使用keras L = Input(shape=(20, 10,)) h1 = Dense(8)(L) 层。