【发布时间】:2019-08-29 00:55:19
【问题描述】:
我有一个简单的 CNN,带有两个用于文本处理的输入(代码如下)。一个用于令牌的输入,另一个用于权重。两个输入都是相同MAX_LENGTH 的序列。在通过嵌入层传递令牌后,我想将这些嵌入乘以相应的权重。所以我为此目的定义了新的 Lambda 层和函数 mult。
实际行为
当我尝试仅在 batch_size==1 中输入的模型拟合时,它可以工作。但是如果batch_size > 1 它显示了
InvalidArgumentError: Incompatible shapes
预期行为
模型适合任何规模的批次。
例外
以下是运行 fit 时与batch_size=256、MAX_LENGTH=30、EMB_SIZE=300 一起出现的异常示例:
InvalidArgumentError: Incompatible shapes: [256,30,300] vs. [30,256] [[{{node lambda_41/mul}}]]
它是否暗示 imp_w 张量形状等于 [30,256]?不应该等于[256,30]吗?
最后的问题是我的网络配置有什么问题?谢谢!
def mult(tensors):
# print(tensors[0].shape, tensors[1].shape)
return np.multiply(tensors[0], K.transpose(tensors[1]))
def TextSentCNN(n_filters, filter_sizes):
inp_t = Input(shape=(MAX_LENGTH,))
inp_w = Input(shape=(MAX_LENGTH,))
x = Embedding(MAX_FEATURES, EMB_SIZE, weights=[embedding_matrix], trainable=False)(inp_t)
x = keras.layers.Lambda(mult, output_shape=(MAX_LENGTH, EMB_SIZE,))([x, inp_w])
x = SpatialDropout1D(0.2)(x)
x = Reshape((MAX_LENGTH, EMB_SIZE, 1))(x)
pools = []
for filter_size in filter_sizes:
conv = Conv2D(n_filters, kernel_size=(filter_size, EMB_SIZE), padding='valid', kernel_initializer='normal', activation='relu')(x)
pool = MaxPool2D(pool_size=(MAX_LENGTH - filter_size + 1, 1), strides=(1,1), padding='valid')(conv)
pools.append(pool)
x = Concatenate(axis=1)(pools)
x = Flatten()(x)
x = Dropout(.5)(x)
out = Dense(3, activation='softmax')(x)
model = Model(inputs=[inp_t, inp_w], outputs=out)
model.compile(
loss='categorical_crossentropy',
optimizer=Adam(lr=0.001),
metrics=['accuracy']
)
return model
【问题讨论】:
标签: tensorflow lambda keras embedding