微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

神经网络返回三个类,而实际是 2

如何解决神经网络返回三个类,而实际是 2

我想问与之前问题相关的几乎最后一个问题:

有问题描述:

所以我有两个类别(狗和猫),下面我有以下代码用于将数据读入列表并将它们转换为数组(numpy数组)

用于安装谷歌驱动器

from google.colab import drive
drive.mount("/content/drive",force_remount=True)

导入所有必要的库(glob 实际上我不需要但留下来)

import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
import glob

它只是演示读取和显示图像以备将来使用

#Set main directory and also categories. read the images
MainDirectory ="/content/drive/My Drive/Colab Notebooks/2020YearDeepLearning/Animals/Petimages/"
Categories =["Dog","Cat"]
for  category in Categories:
   path =os.path.join(MainDirectory,category)
   print(path)
   for img in os.listdir(path):
      img_array =cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
      plt.imshow(img_array,cmap="gray")
      plt.show()
      break
   break

图像整形演示

IMG_SIZE=70
img_array =cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
plt.imshow(img_array,cmap='gray')
plt.show()

现在有实际的代码,这意味着读取数据和标签(狗和猫,狗是 0,猫是 1)并将它们放入数组

#Create  a training Data
training_data =[]
for  category in Categories:
      path =os.path.join(MainDirectory,category)
      class_num =Categories.index(category)
      for img in os.listdir(path):
        try:
          img_array =cv2.imread(os.path.join(path,cv2.IMREAD_GRAYSCALE)
          img_array =cv2.resize(img_array,IMG_SIZE))
          training_data.append([img_array,class_num])
        except Exception as e:
          pass

在那之后我只是洗牌数据

import random
random.shuffle(training_data)

将数据分离成X和y并通过相应的整形转换为numpy数组

X =[]
y =[]
for features,label in training_data:
  X.append(features)
  y.append(label)
X =np.array(X).reshape(-1,IMG_SIZE,1)
y =np.array(y)

我想证明 y 只有两个可能的值(dog 是 0 和 cat 是 1 )

print(np.unique(y)) - which returns[0,1]

现在是实际代码

#create   simple convolutional neural network
#normalize data  and load all necessary  libraries
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D,Activation
X =X/255.0
model =Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(filters=32,3)))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(units=32))
model.add(Dense(units=1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

我使用以下命令训练了数据

model.fit(X,y,batch_size=16,validation_split=0.1,epochs=10)

这是训练的图像

enter image description here

在那之后,我随机拍摄了猫和狗的照片并运行以下命令(这个例子我使用的是狗的照片)

#for testing
image =cv2.imread("/content/drive/My Drive/Colab Notebooks/2020YearDeepLearning/Animals/test.jpg")
image =cv2.resize(image,IMG_SIZE))
image =np.array(image).reshape(-1,1)
print(model.predict_classes(image))

结果是这样的: 了解更多详情。

[[0]
 [0]
 [0]]

对于猫,我得到了这个

[[1]
 [0]
 [0]]

我应该得到三个元素的结果吗?我的意思是三个元素的数组?其实我有两个班对吗?如果我错了,请告诉我

解决方法

这是我怀疑的:

如果您的图像不是灰色的,这意味着它像普通 RBG 图像一样具有三个通道,那么您在此处调整大小 image =np.array(image).reshape(-1,IMG_SIZE,1) 实际上使返回的图像的形状为 (3,1),这意味着您实际上预测时输入三个样本,每个样本有 1 个通道,当然你会得到三个结果。

另外,当你加载图像进行训练时,你加载了 grayscale,但是当你加载进行预测时,你忘记了这样做。所以这就是为什么你的训练有效但不能预测的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。