【发布时间】:2019-06-09 23:09:20
【问题描述】:
我正在尝试让 Keras 训练一个多类分类模型,该模型可以写在这样的网络中:
唯一可训练的参数集是,其余的都给出。函数 fi 是常用数学函数的组合(例如 .Sigma 代表对前面的项求和,softmax 是常用函数。 (x1,x2,...xn) 是训练集或测试集的元素,@ 987654330@ 是已选择的原始数据的特定子集。
更深入的模型:
具体来说,给定 (x_1,x_2,...,x_n) 训练或测试集中的输入,网络评估
其中 fi 是数学函数, 是原始数据的特定子集的行,系数 是我要训练的参数。 当我使用 keras 时,我希望它为每一行添加一个偏差项。
在上述评估之后,我将应用一个 softmax 层(上面 m 行中的每一行都是将作为 softmax 函数的输入的数字)。
最后我想编译模型并像往常一样运行model.fit。
问题是我无法将表达式转换为 keras sintax。
我的尝试:
按照上面的网络从头开始,我首先尝试将 形式的每个表达式视为序列模型中的 lambda 层,但我能做的最好的工作是将密集层与线性激活相结合(将扮演一行参数的角色:)后跟一个 Lambda 层,输出一个向量 ,而无需求和,如下所示:
model = Sequential()
#single row considered:
model.add(Lambda(lambda x: f_fixedRow(x), input_shape=(nFeatures,)))
#parameters set after lambda layer to get (a1*f(x1,y1),...,an*f(xn,yn)) and not (f(a1*x1,y1),...,f(an*xn,yn))
model.add(Dense(nFeatures, activation='linear'))
#missing summation: sum(x)
#missing evaluation of f in all other rows
model.add(Dense(classes,activation='softmax',trainable=False)) #should get all rows
model.compile(optimizer='sgd',
loss='categorical_crossentropy',
metrics=['accuracy'])
另外,我必须在 lambda 函数调用中定义函数,其中 参数已经固定(因为 lambda 函数只能将输入层作为变量):
def f_fixedRow(x):
#picking a particular row (as a vector) to evaluate f in (f works element-wise)
y=tf.constant(value=x[0,:],dtype=tf.float32)
return f(x,y)
我设法用 tensorflow 编写了 f 函数(按元素连续工作),尽管这可能是我的代码中出现问题的原因(并且上述解决方法似乎不自然)。
我还认为,如果我可以在上述尝试中正确编写向量的元素总和,我可以使用 keras 功能 API 以并行化方式重复相同的过程,然后将每个并行模型的输出插入到softmax 函数,我需要。
我考虑的另一种方法是训练参数保持它们在Network Description 中看到的自然矩阵结构,也许写一个矩阵 Lambda 层,但我找不到与这个想法相关的任何东西。
无论如何,我不确定在 keras 中使用此模型的好方法是什么,也许由于参数的编写方式不标准或缺乏 tensorflow 经验,我错过了重要的一点。欢迎提出任何建议。
【问题讨论】:
-
请帮我解决这些问题:
1 -你打算如何选择特定的x_pk集合?2 -a_pk每行x_pk的权重真的不同吗? (在这种情况下,您必须始终选择具有相同大小的子集)。 -
@DanielMöller 1- x_pk 的集合已在此阶段定义(运行特定算法)。 2- 是的,每一行都有一组不同的权重(大小都相同),因此在这个公式中,我们有一个参数矩阵 a_pk。
-
f函数在答案的最后一部分:)
标签: python tensorflow keras neural-network