我想在keras中构建一个自定义层,以便对最后一层的输出进行线性变换。 例如,我从最后一层获得输出X,我的新层将输出X.dot(W)+ b。
W的形状为(49,10)
,X的形状应为(64,49)
,b的形状为(10,)
但是,X的形状为(?, 7, 7, 64)
,当我尝试重塑形状时,它的形状为shape=(64, ?)
。问号是什么意思?您能告诉我在最后一层的输出上进行线性变换的正确方法吗?
答案 0 :(得分:1)
问号通常代表批量大小,这对模型体系结构没有影响。
您应该可以用X
重塑keras.layers.Reshape((64,49))(X)
的形状。
您可以在Lambda层中包装任意张量流操作,例如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)