【发布时间】:2017-09-04 21:53:28
【问题描述】:
我正在尝试将 scikit-learn 的 PolynomialFeatures 实现为 tensorflow 和 Keras 中的前馈神经网络中的一个层。为简单起见,我将举一个使用 NumPy 数组的示例。如果一个batch有3个样本,并且某一层的激活等于(3, 2)形矩阵
>>> X = np.arange(0, 6).reshape(2, 3)
>>> X
array([[0, 1],
[2, 3],
[4, 5]])
那么我希望下一层的激活等于X 的 2 次多项式特征扩展:
>>> from sklearn.preprocessing import PolynomialFeatures
>>> PolynomialFeatures(degree=2).fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
也就是说,如果层 i 的激活是矩阵X(形状为(batch_size, num_features)),那么对于参数选择degree=2 我想要层的激活i + 1 是
- 一列
batch_size很多1., -
X自己, - 以及
X的所有无序列对的元素乘积:X[:, 0] * X[:, 0]、X[:, 0] * X[:, 1]和X[:, 1] * X[:, 1]。
到目前为止,我最接近的解决方案是连接X 的一些幂:
import keras.backend as K
X = K.reshape(K.arange(0, 6), (3, 2))
with K.get_session().as_default():
print(K.concatenate([K.pow(X, 0), K.pow(X, 1), K.pow(X, 2)]).eval())
输出:
[[ 1 1 0 1 0 1]
[ 1 1 2 3 4 9]
[ 1 1 4 5 16 25]]
即,1s 的两列(比我想要的多一个,但我可以忍受这种重复)、X 本身和X 平方元素的连接。
有没有办法计算 不同 列的乘积(以自动可微分的方式)?我无法弄清楚如何在张量流中实现的step of PolynomialFeatures 是用另一个矩阵的某些列的乘积(跨越axis=1)填充矩阵的列:XP[:, i] = X[:, c].prod(axis=1),其中c 是一个元组(0, 0, 1) 等索引。
【问题讨论】:
标签: python tensorflow polynomial-math keras-layer