我的输入只是一个包含45781行和两列的CSV文件。我试图在神经网络上训练我的数据,但在尝试拟合模型时,它抛出了一个错误。
ValueError: Error when checking input: expected dense_26_input to have shape (45781,) but got array with shape (2,)
我尝试按照这个链接中给出的解决方案来实现:
但我仍然无法运行代码。这是我的代码:
X = df.iloc[:, 0:2].valuesy = df.iloc[:, 2].valuesdf_sklearn = df.copy()lb_make = LabelEncoder()df_sklearn['Type'] = lb_make.fit_transform(df['Type'])df_sklearn.head() #结果是向df添加一个新列df_onehot = df.copy()df_onehot = pd.get_dummies(df_onehot, columns=['Type'], prefix = ['Type'])df_onehot_sklearn = df.copy()lb = LabelBinarizer()lb_results = lb.fit_transform(df_onehot_sklearn['Type'])lb_results_df = pd.DataFrame(lb_results, columns=lb.classes_)result_df = pd.concat([df_onehot_sklearn, lb_results_df], axis=1)X_train, X_test, y_train, y_test = train_test_split(X, lb_results_df, test_size = 0.4)classifier = Sequential()classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu', input_dim = 45781))classifier.add(Dense(output_dim = 6, init = 'uniform', activation = 'relu'))classifier.add(Dense(output_dim = 1, init = 'uniform', activation = 'sigmoid'))classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])classifier.fit(X_train, y_train, batch_size = 10, nb_epoch = 100)
回答:
通常情况下,行的数量是你训练的样本数,模型期望你省略这个维度。因此,如果有45781个样本,每个样本有2列,那么input_dim应该为2。此外,如果你在堆叠层时,可以省略output_dim参数,但你必须指定units(神经元的数量)。
最后的Dense层需要有与y的维度相同数量的神经元(在你的例子中是20)。
下面是一个使用虚拟数据的示例:
X_train = np.random.random((300,2))y_train = np.random.random((300,20))classifier = Sequential()classifier.add(Dense(units = 6, init = 'uniform', activation = 'relu', input_dim = 2))classifier.add(Dense(units = 6, init = 'uniform', activation = 'relu'))classifier.add(Dense(units = 20, init = 'uniform', activation = 'sigmoid'))classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])classifier.summary()classifier.fit(X_train, y_train, batch_size=10, nb_epoch=100)