我正在尝试用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:
我不知道怎么了。
注:我还尝试了不同的input_shape
,如(32,39),(39,32)等
你不想要32个大小为39的数组,你想要一个大小为(32,39)的数组。
所以你必须将input_shape更改为(None, 39), None允许你动态更改batch_size,并将batch_x更改为形状为(32,39)的numpy数组
在Keras中,输出而不是输入维度是第一个参数。Keras文档首页的例子非常清楚:
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_形状呢?只是重塑输入(和标签)以匹配默认假设?此外,在进行更复杂的安排之前,您可以尝试在输入数据集(或其中的一部分)上运行基本的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