Keras形状的训练功能

时间:2016-09-19 05:47:47

标签: python python-2.7 machine-learning keras training-data

我试图用keras train_on_batch函数训练nn。我有39个功能,并希望批次包含32个样本。所以我有一个32个numpy数组的列表,用于每次训练迭代。

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

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)等。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

在Keras中,输出而不是输入维度是第一个arg。 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_ 形状?只是重塑您的输入(和标签)以匹配默认假设?此外,您可以尝试在输入数据集(或其中某些部分)上运行基本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