Tensorflow keras中的自定义线性变换

Tensorflow keras中的自定义线性变换,tensorflow,machine-learning,keras,Tensorflow,Machine Learning,Keras,我想在keras中构建一个定制层,对最后一层的输出进行线性变换。 例如,我从上一层得到一个输出X,我的新层将输出X.dot(W)+b W的形状是(49,10),X的形状应该是(64,49),b的形状是(10,) 然而,X的形状是(?,7,7,64),当我试图重塑它时,它变成形状=(64,?)。问号是什么意思?您能告诉我对最后一层的输出进行线性变换的正确方法吗?问号通常表示批量大小,这对模型架构没有影响 您应该能够使用keras.layers.reformate((64,49))(X)重塑您的X

我想在keras中构建一个定制层,对最后一层的输出进行线性变换。 例如,我从上一层得到一个输出X,我的新层将输出X.dot(W)+b

W的形状是
(49,10)
,X的形状应该是
(64,49)
,b的形状是(10,)


然而,X的形状是
(?,7,7,64)
,当我试图重塑它时,它变成
形状=(64,?)
。问号是什么意思?您能告诉我对最后一层的输出进行线性变换的正确方法吗?

问号通常表示批量大小,这对模型架构没有影响

您应该能够使用
keras.layers.reformate((64,49))(X)
重塑您的
X

您可以将任意tensorflow操作(如
tf.matmul
)包装在一个层中,以便在Keras模型中包含自定义层。实现此技巧的最小工作示例:

import tensorflow as tf
from keras.layers import Dense, Lambda, Input
from keras.models import Model

W = tf.random_normal(shape=(128,20))
b = tf.random_normal(shape=(20,))

inp = Input(shape=(10,))
x = Dense(128)(inp)
y = Lambda(lambda x: tf.matmul(x, W) + b)(x)
model = Model(inp, y)

最后:请参阅关于如何使用可训练权重编写自定义层的说明。

如何使用模型学习线性变换的权重?您需要编写自定义层。这里的第一个示例基本上涵盖了它: