我在Keras有一个模型,我想明确地让神经网络看几个特征的总和。我试着这样做:
sum_input_p = Lambda(sumFunc)(input_p)
d_input = keras.layers.concatenate(
[input_p, cont_cond, sum_input_p, one_hot_cond_1, one_hot_cond_2 ], axis=-1)
其中
def sumFunc(x):
return K.reshape(K.sum(x), [1])
但是我收到了一个错误:
ValueError:
Concatenate
图层需要具有匹配形状的输入 除了连续轴。得到输入形状:[(无,267),(无, 1),(1,),(None,4),(None,2)]
这是因为reshape
中的sumFunc
步吗?我怎样才能正确地重塑它,以便它可以与神经网络中的其他功能连接起来?
答案 0 :(得分:2)
这是因为K.sum()
(K.reshape()
并非真的需要。)
所有其他张量(input_p
,cont_cond
等)仍然包含我假设的批量样本(即它们的形状为(batch_size, num_features)
,而batch_size = None
仅为sum_input_p
在运行图表时定义)。因此,您可能希望(batch_size, 1)
具有形状x
,即计算输入张量import keras
import keras.backend as K
from keras.layers import Input, Lambda
import numpy as np
def sumFunc(x):
x_axes = np.arange(0, len(x.get_shape().as_list()))
# ... or simply x_axes = [0, 1] in your case, since the shape of x is known
y = K.sum(x, axis=x_axes[1:]) # y of shape (batch_size,)
y = K.expand_dims(y, -1) # y of shape (batch_size, 1)
return y
input_p = Input(shape=(267,))
sum_input_p = Lambda(sumFunc)(input_p)
print(sum_input_p)
# > Tensor("lambda_1/ExpandDims:0", shape=(?, 1), dtype=float32)
d_input = keras.layers.concatenate([input_p, sum_input_p], axis=-1)
print(d_input)
# > Tensor("concatenate_1/concat:0", shape=(?, 268), dtype=float32)
的所有维度的总和,但第一维度(对应于批量大小)除外。“ p>
cherry-pick