用于训练的 Keras 特征形状

Keras shape of features for training

我正在尝试使用 keras train_on_batch 函数训练 nn。我有 39 个特征,并希望一个批次包含 32 个样本。所以对于每次训练迭代,我都有一个包含 32 个 numpy 数组的列表。

所以这是我的代码(这里每个 batch_x 是一个包含 32 个 numpy 数组的列表,每个数组包含 39 个特征):

input_shape = (39,)

model = Sequential()
model.add(Dense(39, input_shape=input_shape)) # show you is only first layer
... 

for batch_x, batch_y in train_gen:
    model.train_on_batch(batch_x, batch_y)

但是突然报错:

Exception: Error when checking model input: the list of Numpy arrays
that you are passing to your model is not the size the model expected.
Expected to see 1 arrays but instead got the following list of 32 arrays:

我不太确定哪里出了问题。

P.S。我也尝试了不同的 input_shape 例如 (32, 39), (39, 32) 等等

您不需要 32 个大小为 39 的数组,您需要一个大小为 (32, 39) 的数组。

因此您必须将 input_shape 更改为 (None, 39),None 允许您动态更改 batch_size,并更改 batch_x成为一个形状为 (32, 39) 的 numpy 数组。

在 Keras 中,第一个参数是 output 而不是 input 维度。 Keras docs首页示例非常清楚:

model.add(Dense(output_dim=64, input_dim=100))

调整该示例以符合我猜的您的要求:

model.add(Dense(output_dim=39, input_dim=39))

在您的代码中,Dense 层中的第一个位置参数是 39,它将 输出 设置为 39-D,而不是输入,正如您可能假设的那样。你说你有 39 个输入特征。第一层(我试图复制你想要的东西)不对你的 39 维输入特征向量进行任何压缩或特征提取。

为什么不为每一层设置输入和输出数组的维度(如示例中所示),而单独保留 input_shape?只是重塑您的输入(和标签)以匹配默认假设?此外,您可以在输入数据集(或其中的一部分)上尝试 运行 基本 fit 方法,然后再进行更复杂的安排,例如像您所做的那样手动分批训练。

以下是您的特征维度的玩具问题示例:

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.regularizers import l1l2

X = np.random.randn(1000, 39)
y = np.array([X[i,7:13].sum() for i in range(X.shape[0])])

nn = Sequential()
nn.add(Dense(output_dim=1, input_dim=39))
nn.compile('sgd', 'mse')
nn.fit(X, y, nb_epoch=10)

给出:

Epoch 1/10
1000/1000 [==============================] - 0s - loss: 4.6266      
...    
Epoch 10/10
1000/1000 [==============================] - 0s - loss: 1.4048e-04