用于创建CNN的Keras-数组大小为训练图像的两倍

n8ghc7c1  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在创建一个CNN来确定扫描的图像是猫还是狗。我有一个文件夹,里面有猫和狗的照片。猫在图像#前有“cat.”,狗在图像#前有“dog”;例如猫的图像可以是“cat.403.jpg”。总共有大约20,000张图片。然而,当我运行下面的代码时,我的数组存储了大约40,000个值,几乎是数量的两倍。我不明白这是怎么回事代码如下:

  1. DATADIR = "C:/Users/me/Jupyter Codes/dogs-vs-cats/train/train"
  2. CATEGORIES = ['dog', 'cat']
  3. IMG_SIZE = 50
  4. training_data = []
  5. cat_img_array = []
  6. dog_img_array = []
  7. def create_training_data():
  8. for category in CATEGORIES:
  9. train_path = os.path.join(DATADIR) # path to train folder
  10. class_num = CATEGORIES.index(category)
  11. for img in os.listdir(train_path):
  12. animal = img.split('.')[0]
  13. if animal == 'cat':
  14. cat_img_array = cv2.imread(os.path.join(train_path, img), cv2.IMREAD_GRAYSCALE) # convert to grayscale bc RGB > gray; plus not essential
  15. cv2.resize(cat_img_array, (IMG_SIZE, IMG_SIZE))
  16. training_data.append([cat_img_array, class_num])
  17. elif animal == 'dog':
  18. dog_img_array = cv2.imread(os.path.join(train_path, img), cv2.IMREAD_GRAYSCALE)
  19. cv2.resize(dog_img_array, (IMG_SIZE, IMG_SIZE))
  20. training_data.append([dog_img_array, class_num])
  21. create_training_data()
  22. print(len(training_data))

这将返回41900张图像
当我运行这段代码时:

  1. # pack data into variables before fed into CNN
  2. X = []
  3. Y = []
  4. for features, label in training_data:
  5. X.append(features)
  6. Y.append(label)
  7. X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1) # -1 -> make array number based on data; 1 -> grayscale (3 if RGB)
  8. Y = np.array(Y).reshape(-1, IMG_SIZE, IMG_SIZE, 1)

我得到这些错误消息:
VisibleDeprecationWarning:不赞成从不规则的嵌套序列(即具有不同长度或形状的列表或元组或ndarray的列表或元组)创建ndarray。如果你打算这样做,你必须在创建ndarray时指定'dtype=object'。X = np.array(X).reshape(-1,IMG_SIZE,IMG_SIZE,1)# -1 ->根据数据生成数组编号; 1 ->灰度(如果是RGB,则为3)
ValueError:无法将大小为41900的数组整形为shape(50,50,1)

jmo0nnb3

jmo0nnb31#

您正在使用此行对数据集进行两次迭代:

  1. for category in CATEGORIES: ## CATEGORIES = ['dog', 'cat']

从这个意义上说,你添加了两次所有的东西,也错误地标记了两次数据-第一次通过它将所有东西标记为“狗”,然后第二次“猫”。
也检查这一行..它没有做你想要的,因为它没有修改数组的位置。

  1. cv2.resize(cat_img_array, (IMG_SIZE, IMG_SIZE))

如果你只是做了这样的事情。你也可以去掉if语句。

  1. CATEGORIES = {'cat': 0, 'dog': 1}
  2. for img in os.listdir(train_path):
  3. animal = img.split('.')[0]
  4. img_array = cv2.imread(os.path.join(train_path, img), cv2.IMREAD_GRAYSCALE) # convert to grayscale bc RGB > gray; plus not essential
  5. resized = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
  6. training_data.append([resized, CATEGORIES[animal]])
展开查看全部

相关问题