我需要实现以下模型。
我必须对数据序列执行函数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。
我的问题是
我需要将model_inputs输入向量除以L形为2的输入向量。如何在层中完成此操作?还是可以有一个输入向量?
如何在同一个网络的L个副本中实现功能A(权重是相同的)
如何将m * L输出合并到一个输出向量,以便可以将其输入到函数B?
答案 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)
层。