ValueError:发现样本数量不一致的输入变量:[4, 304]

Posted

技术标签:

【中文标题】ValueError:发现样本数量不一致的输入变量:[4, 304]【英文标题】:ValueError: Found input variables with inconsistent numbers of samples: [4, 304] 【发布时间】:2022-01-11 13:11:47 【问题描述】:

我试图从我制作的模型中制作一个混淆矩阵,在制作模型之前一切似乎都很好,直到我遇到一个错误提示

ValueError:发现输入变量的数量不一致 样本:[4, 304]

这是我使用的代码

# Convert List to numpy array, for Keras use
Train_label = np.eye(n_labels)[label] # One-hot encoding by np array function
Train_data = np.array(data)
print("Dataset shape is",Train_data.shape, "(size, timestep, column, row, channel)")
print("Label shape is",Train_label.shape,"(size, label onehot vector)")
# shuffling dataset for input fit function
# if don`t, can`t train model entirely
x = np.arange(Train_label.shape[0])
np.random.shuffle(x)
# same order shuffle is needed
Train_label = Train_label[x]
Train_data = Train_data[x]

train_size = 0.9
X_train=Train_data[:int(Totalnb * 0.9),:]
Y_train=Train_label[:int(Totalnb * 0.9)]
X_test=Train_data[int(Totalnb * 0.1):,:]
Y_test=Train_label[int(Totalnb * 0.1):]
# 2. Buliding a Model
# declare input layer for CNN+LSTM architecture
video = Input(shape=(timesteps,img_col,img_row,img_channel))
STEPS_PER_EPOCH = 120
#AlexNet Layer
model = tf.keras.models.Sequential([
    # 1st conv
  tf.keras.layers.Conv2D(96, (11,11),strides=(4,4), activation='relu', input_shape=(img_col, img_row, img_channel)),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.MaxPooling2D(2, strides=(2,2)),
    # 2nd conv
  tf.keras.layers.Conv2D(256, (5,5),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.MaxPooling2D(2, strides=(2,2)),
     # 3rd conv
  tf.keras.layers.Conv2D(384, (3,3),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
    # 4th conv
  tf.keras.layers.Conv2D(384, (3,3),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
    # 5th Conv
  tf.keras.layers.Conv2D(256, (3, 3), strides=(1, 1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.MaxPooling2D(2, strides=(2,2)),
])
model.trainable = True
# FC Dense Layer
x = model.output
x = Flatten()(x)
cnn_out = Dense(128)(x)
# Construct CNN model 
Lstm_inp = Model(model.input, cnn_out)
# Distribute CNN output by timesteps 
encoded_frames = TimeDistributed(Lstm_inp)(video)
# Contruct LSTM model 
encoded_sequence = LSTM(256)(encoded_frames)
hidden_Drop = Dropout(0.2)(encoded_sequence)
hidden_layer = Dense(128)(hidden_Drop)
outputs = Dense(n_labels, activation="softmax")(hidden_layer)
# Contruct CNN+LSTM model 
model = Model([video], outputs)
# 3. Setting up the Model Learning Process
# Model Compile 
opt = SGD(lr=0.01)
model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics=['accuracy'])
model.summary()
# 4. Training the Model
hist = model.fit(X_train, Y_train, batch_size=batch_size, validation_split=validation_ratio, shuffle=True, epochs=num_epochs)

Y_pred2 = model.predict(X_test)
y_pred= np.argmax(Y_pred2, axis=1) # prediksi
y_test=np.argmax(Y_test, axis=0)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred) 
import seaborn as sns
import matplotlib.pyplot as plt
f, ax = plt.subplots(figsize=(8,5))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt=".0f", ax=ax)
plt.xlabel("Y_head")
plt.ylabel("Y_true")
plt.show()
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

一切似乎都很好,但是当我尝试在confusion_matrix(y_test, y_pred) 行中创建混淆矩阵时出现错误

我还是不知道可能是什么问题

希望有人能帮我解决这个问题

非常感谢你们

【问题讨论】:

您能发布整个错误堆栈吗?看起来有点奇怪的一件可能的事情是,在计算 y_predy_test 的 argmax 时,您采用了不同的轴。但这可能没问题,具体取决于您的数据布局。 嗨蒂娜,我刚刚编辑了我遇到的错误问题,如果它取决于我的数据布局,这里是我的驱动器到我的数据集的链接,drive.google.com/drive/folders/… 但是如果它取决于我的数据布局,那么我制作模型时不应该出错吗?因为当我尝试编译和拟合我的模型时一切都很好 【参考方案1】:

张贴我的 cmets 作为完整性的答案:

可能看起来有点奇怪的是,在计算 y_predy_test 的 argmax 时,您采用了不同的轴。但这可能没问题,具体取决于您的数据布局。

y_testy_pred 似乎长度不同。你能检查Y_pred2Y_test的形状,看看你计算argmax的轴是否正确。

【讨论】:

以上是关于ValueError:发现样本数量不一致的输入变量:[4, 304]的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:发现样本数量不一致的输入变量:[100, 300]

混淆矩阵 - ValueError:发现样本数量不一致的输入变量

ValueError:发现样本数量不一致的输入变量:[2750, 1095]

ValueError:发现样本数量不一致的输入变量:[29675、9574、29675]

Sklearn:ValueError:发现样本数量不一致的输入变量:[1, 6]

GridseachCV - ValueError:发现样本数量不一致的输入变量:[33 1]