Machine learning 正确声明Keras中神经网络的输入_形状?

Machine learning 正确声明Keras中神经网络的输入_形状?,machine-learning,neural-network,keras,Machine Learning,Neural Network,Keras,我试图在从CSV文件加载数据类型后编写代码来识别数据类型。因此有5个可能的标签,特征向量包含一个列表列表。特征向量是具有以下形状的列表列表: [斜杠计数、破折号计数、冒号计数、字母、点计数、数字] 然后,我将特征和标签向量拆分为训练集、测试集和验证集。我在Stackoverflow上发现了一些代码,有人编写了这些代码,我使用了相同的代码: X\u序列,X\u测试,y\u序列,y\u测试=序列测试分割(ml\u列表,标签,测试大小=0.3,随机状态=1) X_列,X_值,y_列,y_值=列测试分割

我试图在从CSV文件加载数据类型后编写代码来识别数据类型。因此有5个可能的标签,特征向量包含一个列表列表。特征向量是具有以下形状的列表列表:

[斜杠计数、破折号计数、冒号计数、字母、点计数、数字]

然后,我将特征和标签向量拆分为训练集、测试集和验证集。我在Stackoverflow上发现了一些代码,有人编写了这些代码,我使用了相同的代码:

X\u序列,X\u测试,y\u序列,y\u测试=序列测试分割(ml\u列表,标签,测试大小=0.3,随机状态=1)
X_列,X_值,y_列,y_值=列测试分割(X_列,y_列,测试大小=0.3,随机状态=1)
完成此操作后,我规范化了比例[0,1]中的特征,然后为标签创建分类变量:

min\u max\u scaler=preprocessing.MinMaxScaler()
X_-train_-minmax=min_-max_-scaler.fit_变换(X_-train)
X_-test_-minmax=min_-max_-scaler.fit_变换(X_-test)
X_val_minmax=min_max_scaler.fit_变换(X_val)
从keras.utils导入到_category
y_-train_-minmax=to_-categorical(y_-train)
y_检验_最小最大值=to_分类(y_检验)
y_val_minmax=to_categorical(y_val)
接下来,我试图找到新重新编码的变量的形状:

print(y_train_minmax.shape)#(91366,4)
打印(X_列_最小最大形状)#(91366,6)
打印(X_测试_最小最大形状)#(55939,6)
打印(X_val_minmax.shape)#(39157,6)
打印(y_train_minmax.shape)#(91366,4)
打印(y_测试_最小最大形状)#(55939,4)
打印(y_val_minmax.shape)#(39157,4)
最后,我构建了模型并尝试进行拟合:

model=models.Sequential()
添加(layers.Dense(512,activation='relu',input_shape=(91366,6)))
model.add(layers.Dense(3,activation='softmax'))
compile(优化器='rmsprop',loss='classifical\u crossentropy',metrics=['accurity'])
模型拟合(X\u序列最小值,y\u序列最小值,历代数=5,批量大小=128)
我在运行代码时收到以下消息:

ValueError:检查输入时出错:预期密集_1_输入有3个维度,但得到了具有形状的数组(91366,6)


我相信错误就在我用输入形状创建神经网络时。我很难理解我哪里出错了。任何帮助都会很好

您应该更改此行:

model.add(layers.Dense(512,activation='relu',input_shape=(6,))
keras
中,您不需要直接指定数据集中的示例数。作为
input\u shape
您只需要提供单个数据点的形状

我在您的代码片段中发现的另一个潜在错误是,您应该设置:

model.add(layers.Dense(4,activation='softmax'))
作为输出,单个数据点的形状为
(4,)
。这与您所说的可能的图层不一致,因此我还建议重新检查您的数据


我发现的另一个可能的错误是,您没有为
train
test
valid
数据集训练单独的定标器,而是在
train
集中训练单个定标器,然后使用经过训练的定标器缩放其他数据集

谢谢你回来。在实现了您提供的代码之后,我似乎得到了预期的输出。但是你能进一步详细说明一下测试、培训和验证的划分吗?我认为我的方法是正确的,因为我只是将培训集再次拆分为培训和验证。拆分似乎很好。我唯一关心的是,在开始培训之前,您不应该隐式地使用
test/validation
set中的任何统计信息。当您使用
test/validation
中的统计信息规范化数据时,此规则被打破。请记住,这些集合应该模拟新的数据到达-这就是为什么您不能期望在训练过程中拥有它们。我在训练之前进行拆分的唯一原因是在训练之前显式地重新缩放[0,1]之间的值。根据我的理解,如果特征向量中的每个变量具有非常不同的尺度,则需要使用
scaller
重新缩放
test/valid
使用
training
数据上的
scaller
进行调整。您是指sklearn.preprocessing.StandardScaler吗?我用的是MinMaxScaler。在使用原始数据训练模型之后,重新缩放数据不是一个问题吗?