如何解决神经网络返回三个类,而实际是 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)
在那之后,我随机拍摄了猫和狗的照片并运行以下命令(这个例子我使用的是狗的照片)
#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 举报,一经查实,本站将立刻删除。