我正在尝试编写代码以在从CSV文件加载后识别数据类型。因此,有5个可能的标签,并且特征向量包含列表列表。特征向量是具有以下形状的列表列表:
[slash_count, dash_count, colon_count, letters, dot_count, digits]
然后我将我的功能和标签向量分成训练,测试和验证集。我在Stackoverflow上找到了一些代码写给我的代码并且我使用了相同的代码:
X_train, X_test, y_train, y_test = train_test_split(ml_list, labels, test_size=0.3, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.3, random_state=1)
执行此操作后,我将比例[0,1]中的要素标准化,然后为标签创建分类变量:
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
X_test_minmax = min_max_scaler.fit_transform(X_test)
X_val_minmax = min_max_scaler.fit_transform(X_val)
from keras.utils import to_categorical
y_train_minmax = to_categorical(y_train)
y_test_minmax = to_categorical(y_test)
y_val_minmax = to_categorical(y_val)
接下来,我尝试找到新重新编码的变量的形状:
print(y_train_minmax.shape) #(91366, 4)
print(X_train_minmax.shape) #(91366, 6)
print(X_test_minmax.shape) #(55939, 6)
print(X_val_minmax.shape) #(39157, 6)
print(y_train_minmax.shape) #(91366, 4)
print(y_test_minmax.shape) #(55939, 4)
print(y_val_minmax.shape) #(39157, 4)
最后,我构建模型并尝试适应它:
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(91366, 6)))
model.add(layers.Dense(3, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train_minmax, y_train_minmax, epochs=5, batch_size=128)
运行代码时收到此消息:
ValueError:检查输入时出错:期望的dense_1_input有3个维度,但是有形状的数组(91366,6)
我相信当我使用输入形状创建神经网络时会出现错误。我很难理解错误的地方。任何帮助都会很棒!
答案 0 :(得分:1)
您应该更改此行:
model.add(layers.Dense(512, activation='relu', input_shape=(6,)))
在keras
中,您无需直接指定数据集中的示例数。作为input_shape
,您只需要提供单个数据点的形状。
我在您的代码段中发现的另一个潜在错误是您应该设置:
model.add(layers.Dense(4, activation='softmax'))
由于您的输出单数据点的形状为(4,)
。这与您对可能的图层所说的内容不一致,因此我还建议您重新检查数据。
我发现的另一个可能的错误是您没有为train
,test
和valid
数据集培训单独的缩放器 - 而是在train
集合上的单个缩放器 - 然后使用经过训练的缩放器缩放您的其他数据集。