我正在训练一个神经网络来预测一组文档的文档频率。
主要的想法是将一个包含100个文档和50个标记的矩阵映射到相应的文档频率数组上。
X = (n_samples, 100, 50) -> y = (n_samples, 1, 50)
我的代码是:
model = Sequential()model.add(Dense(50, activation='sigmoid', input_shape=(100,50)))model.add(Dense(50))model.compile(optimizer='rmsprop', loss='mse')model.fit(X_train, y_train, epochs=50)
但我遇到了一个错误:
ValueError: Error when checking target: expected dense_22 to have shape (100, 50) but got array with shape (1, 50)
回答:
这是因为你的输入是二维的,所以你的模型概要如下所示。
_________________________________________________________________Layer (type) Output Shape Param # =================================================================dense_1 (Dense) (None, 100, 50) 2550 _________________________________________________________________dense_2 (Dense) (None, 100, 50) 2550 =================================================================Total params: 5,100Trainable params: 5,100Non-trainable params: 0_________________________________________________________________
尝试在dense_1
或dense_2
之后重塑张量形状,通过在第二个轴上求和或平均来获得与你的Y
相同的形状。
这里是我的示例供你参考
我编写了一个自定义的求和函数,以在第二个轴上求和,使得形状为(None, 100, 50)的张量变为(None, 1, 50)。然后,添加另一个Dense层。
import keras.backend as Kfrom keras.layers import Dense, Lambdafrom keras.models import Sequentialdef mysum(x): return K.sum(x, axis=1, keepdims=True) def mysum_output_shape(input_shape): shape = list(input_shape) print(shape) shape[1] = 1 return tuple(shape) # 随机生成数据import numpy as npX_train = np.random.normal(0, 1, (50,100,50))y_train = np.ones((50, 1, 50))model = Sequential()model.add(Dense(50, activation='sigmoid', input_shape=(100,50)))model.add(Lambda(mysum, output_shape=mysum_output_shape)) model.add(Dense(50))model.compile(optimizer='rmsprop', loss='mse')model.fit(X_train, y_train, epochs=50)
了解你的输入是什么以及张量如何通过每一层进行转换是非常重要的。希望这对你有帮助!