为什么我的机器学习卷积神经网络在Kaggle的猫狗分类预测中只输出错误?

我对机器学习和计算机视觉还比较新。我正在尝试进行猫狗的分类预测,设定0代表猫,1代表狗。但是我的model.fit()函数输出了这个错误。
enter image description here

    ValueError: Input 0 of layer sequential_5 is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: [None, 10000]

这是我的机器学习模型:

import matplotlib.pyplot as pltimport numpy as npfrom PIL import Imageimport cv2#图像存储在'Cat/'和'Dog/'文件夹中animal = ['Cat/','Dog/']images_cat= []images_dog=[]# 读取图像for x in animal:    for i in range(1,12500): # 每个类别的图像从'1.jpg'到'12499.jpg'        try:            image_path = x+ str(i) +'.jpg'# 获取图像路径,例如'Cat/1.jpg'            #print(image_path)            img = cv2.cvtColor(cv2.imread(image_path), cv2.COLOR_BGR2GRAY)            img_resized = cv2.resize(img,dsize=(100,100))            if x == 'Cat/':                images_cat.append(img_resized)            elif x == 'Dog/':                images_dog.append(img_resized)                        except cv2.error as e:            # 有些图像会输出错误并且显然无法读取,因此我只是将它们替换为列表中的第一张图像            if x == 'Cat/':                images_cat.append(images_cat[1])            elif x == 'Dog/':                images_dog.append(images_dog[1])# 为值分配目标y_cat = np.zeros(len(images_cat)) # 猫 == 0y_dog = np.ones(len(images_dog)) # 狗 == 1# 训练图像 = 80%   测试图像 = 20%training_sample_count = round(0.8* len(y_cat))# 列表切片获取上述计算的80%的图像X_cat_train = images_cat [:training_sample_count]y_cat_train_fin = y_cat[:training_sample_count]X_dog_train = images_dog [:training_sample_count]y_dog_train_fin = y_dog[:training_sample_count]# 创建最终的训练列表X_train = X_cat_train + X_dog_trainy_train=[]y_train.append(y_cat_train_fin.data)y_train.append(y_dog_train_fin.data)y_train = np.reshape(y_train,(19998,))np.shape(y_train)# 输出: (19998,)# 归一化数据X_train = [x / 255.0 for x in X_train]X_train = np.reshape(X_train,(19998,10000))np.shape(X_train) #输出: (19998, 10000)from tensorflow.keras import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, MaxPooling2D, Conv2D, Flatten model = Sequential()model.add(Conv2D(32,kernel_size=(5,5),padding='same', activation ='relu'))model.add(MaxPooling2D((3,3)))model.add(Conv2D(32,kernel_size=(5,5),padding='same', activation ='relu'))model.add(MaxPooling2D((3,3)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(1, activation='softmax'))model.compile(optimizer='adam', loss="sparse_categorical_crossentropy", metrics=["accuracy"])model.fit(    X_train,    y_train,    epochs=10,    batch_size=10000)

我还没有处理测试图像,但我基本上是尝试训练这个模型以便将来使用数据(如自己的猫狗图像进行预测)。如果有人能帮我解决这个问题,我将不胜感激,因为我现在卡住了。谢谢:)


回答:

你的模型存在几个问题 –

  1. 你正在进行二分类,但使用的是多类单标签分类的配置。需要更改你的损失函数和最后一层的激活函数以获得正确的结果。请参考下表进行检查。

enter image description here

  1. 你将每个样本的1D数组传递给Conv2D层,而它需要一个3D张量。这就是错误expected min_ndim=4, found ndim=2.的原因。预期的维度是(batch, height, width, channels),但实际得到的是(batch, pixels)。我已经添加了一个model.add(Reshape((100,100,1), input_shape=(10000,))),它将10000个像素重塑为(100,100,1),以便正确地传递给conv2d层。

  2. 最后,你有19998个样本图像。虽然可能,但将批量大小设置为10000是没有意义的。批量大小是导致梯度更新的样本数量。在你的情况下,每个epoch将只有2次梯度更新,因为19998/10000约等于2。我建议将批量大小设置为128或64或32。我已在model.fit中将其设置为128

请在下面找到更新后的代码。

from tensorflow.keras import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, MaxPooling2D, Conv2D, Flatten X_train = np.random.random((500, 10000))Y_train = np.random.randint(0,2,(500,)) #0, 0, 1, 0, 1...model = Sequential()model.add(Reshape((100,100,1), input_shape=(10000,)))model.add(Conv2D(32,kernel_size=(5,5), padding='same', activation ='relu'))model.add(MaxPooling2D((3,3)))model.add(Conv2D(32,kernel_size=(5,5),padding='same', activation ='relu'))model.add(MaxPooling2D((3,3)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(1, activation='sigmoid'))model.compile(optimizer='adam', loss="binary_crossentropy", metrics=["accuracy"])model.fit(    X_train,    Y_train,    epochs=3,    batch_size=128)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注