重塑矩阵中的错误 - 机器学习

时间:2021-07-17 19:20:46

标签: python pandas numpy

执行此代码时出现以下问题: 我试图让这些代码工作:

import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D
from tensorflow.keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
from sklearn.model_selection import StratifiedKFold
import tensorflow as tf

from sklearn.preprocessing import LabelEncoder
from keras.utils import to_categorical

num_rows = 13
num_columns = 87
num_channels = 1
seed = 2001

path = 'C:/Users/lione/OneDrive/Bureau/Lionel/LDK_360/Projets/Fexy-consign/Data/cleaned_dataset.xlsx'

featuresdf = pd.read_excel(path)

X = np.array(featuresdf.feature.tolist())
y = np.array(featuresdf.label.tolist())

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores = []

X = X.reshape(X.shape[0], num_rows, num_columns, num_channels)

for train, test in kfold.split(X, y):



  le = LabelEncoder()
  yy = to_categorical(le.fit_transform(y))
  num_labels = yy.shape[1]
  num_labels = 5
  filter_size = 2

# Construct model
  model = Sequential()
  model.add(Conv2D(filters=16, kernel_size=2, input_shape=(num_rows, num_columns, num_channels), activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=32, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=64, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))
  model.add(GlobalAveragePooling2D())

  model.add(Dense(num_labels, activation='softmax'))
  # Compile model
  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  #Fit the model
  train_data = tf.data.Dataset.from_tensor_slices((X[train], yy[train]))
  model.fit(X[train], yy[train], epochs=100, batch_size=32, verbose=2)
 # model.fit(train_data, epochs=100, batch_size=32, verbose=2)
  # evaluate the model
  scores = model.evaluate(X[test], yy[test], verbose=2)
  print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
  cvscores.append(scores[1] * 100)

print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

错误:

cannot reshape array of size 2001 into shape (2001,13,87,1)

我尝试了很多解决方案,但都没有成功...

1 个答案:

答案 0 :(得分:1)

featuresdf.feature.tolist() 可能会生成一个 1d list

检查 feature 输入的 featuresdf 列以查看该列中有多少元素(并检查其排名)。

如果它有 2001 个元素,那么当您使用 reshape 时,重构数组的维度最终必须具有相同数量的元素。

您尝试制作的重构数组有 2001 x 13 x 87 x 1 = 2263131 个元素。这是行不通的,因为您从 2001 个元素开始。

有趣的是,2001 年的质因数是:3、23 和 29。乘以 3 x 29 = 87,这是重构数组中四个维度之一的长度。

也许您有错别字,需要将 2001 个元素的列表调整为 87 x 23 而不是 87 x 13 的数组? (绝对不是 2001 x 87 x 13 x 1。)