Python 用于训练的Keras特征形状

Python 用于训练的Keras特征形状,python,python-2.7,machine-learning,keras,training-data,Python,Python 2.7,Machine Learning,Keras,Training Data,我正在尝试使用kerastrain\u on\u batch函数训练nn。我有39个功能,希望一批包含32个样本。因此,我为每个训练迭代列出了32个numpy数组 下面是我的代码(这里每个batch_x是一个包含32个numpy数组的列表,每个数组包含39个特性): 但突然我犯了一个错误: Exception: Error when checking model input: the list of Numpy arrays that you are passing to your model

我正在尝试使用keras
train\u on\u batch
函数训练nn。我有39个功能,希望一批包含32个样本。因此,我为每个训练迭代列出了32个numpy数组

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

但突然我犯了一个错误:

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、 我还尝试过不同的
input_UShape
,例如(32、39)、(39、32)等。

您不需要32个大小为39的数组,您需要一个大小为32、39的数组


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

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


因此,您必须将输入形状更改为(无,39),无允许您动态更改批次大小,并将批次x更改为形状的numpy数组(32,39)。

在Keras中,第一个参数是输出而不是输入维度。头版的例子非常清楚:

model.add(Dense(output_dim=64, input_dim=100))
调整该示例以符合我猜您的要求:

model.add(Dense(output_dim=39, input_dim=39))
在代码中,
密集
层中的第一个位置参数是
39
,它将输出设置为39-D,而不是您可能假设的输入。你说你有39个输入功能。第一层(在我尝试复制您想要的内容时)不会从39维输入特征向量中进行任何压缩或特征提取

为什么不为每一层设置输入和输出数组的尺寸(如示例中所示),而不使用输入形状?只是重新调整输入(和标签)以匹配默认假设?此外,您还可以尝试在输入数据集(或其中的一部分)上运行basic
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

在Keras中,第一个参数是输出而不是输入维度。头版的例子非常清楚:

model.add(Dense(output_dim=64, input_dim=100))
调整该示例以符合我猜您的要求:

model.add(Dense(output_dim=39, input_dim=39))
在代码中,
密集
层中的第一个位置参数是
39
,它将输出设置为39-D,而不是您可能假设的输入。你说你有39个输入功能。第一层(在我尝试复制您想要的内容时)不会从39维输入特征向量中进行任何压缩或特征提取

为什么不为每一层设置输入和输出数组的尺寸(如示例中所示),而不使用输入形状?只是重新调整输入(和标签)以匹配默认假设?此外,您还可以尝试在输入数据集(或其中的一部分)上运行basic
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