Sni*_*h30 4 python neural-network conv-neural-network keras tensorflow
因此,我是深度学习的新手,我从使用 Keras 的 CNN 模型的猫和狗数据集开始。
在我的代码中,我无法获得classifier.predict或 的输出概率classifier.predict_proba。我刚刚得到的输出为[[0,1]]or [[1,0]]。我尝试过使用几张图像。
但我正在寻找类似的东西[[0.4,0.6]],[[0.89,0.11]]
我尝试将损失函数从 更改binary_crossentropy为categorical_crossentropy。
我尝试将输出层的激活函数从 更改sigmoid为softmax。
我也尝试过将class_modeinflow_from_directory从更改binary为categorical。
我认为数据类型可能出错,因为输出数组的类型是 float32。但即使这是错误,我也不知道如何更改它。
我无法找到我哪里出错了。请澄清/帮助。谢谢。
为什么我需要概率?
在我的另一个项目中,我将把图像分成“n”个较小的部分。然后,我将分别对“n”个片段使用分类器,并找到概率最大的一个片段。为此,我不会使用猫和狗的数据集。它用于分箱,并且该数据集也将以二进制输出为“是”或“否”。也欢迎对此提出任何建议。谢谢。
Github 中的代码链接。
#Building the CNN
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
#Initialising the CNN
classifier = Sequential()
#Step 1 - Convolution
classifier.add(Convolution2D(filters=32,kernel_size=[3,3],input_shape=(64,64,3),activation='relu'))
#Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
#Adding another Convolutional Layer for better accuracy
#classifier.add(Convolution2D(filters=32,kernel_size=[3,3],activation='relu'))
#classifier.add(MaxPooling2D(pool_size=(2,2),strides=2))
#Step 3 - Flattening
classifier.add(Flatten())
#Step 4 - Fully Connected Layers
classifier.add(Dense(units= 64, activation='relu'))
classifier.add(Dense(units= 2, activation='softmax'))
#Compiling the CNN
classifier.compile(optimizer='adam',loss = 'categorical_crossentropy', metrics=['accuracy'])
#Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
train_datagen=ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen=ImageDataGenerator(rescale=1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size=(64,64),
batch_size=32,
class_mode='categorical')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size=(64,64),
batch_size=32,
class_mode='categorical')
classifier.fit_generator(training_set,
steps_per_epoch=250,
epochs=3, #Just for time being I've kept very few epochs.
validation_data=test_set,
validation_steps=62)
#Making new Predictions
import numpy as np
from keras.preprocessing import image
test_image_luna=image.load_img('dataset/single/SkilletLuna.JPG',target_size=(64,64))
test_image2=image.img_to_array(test_image_luna)
test_image2=np.expand_dims(test_image2,axis=0)
luna=classifier.predict_proba(test_image2)
In [11]: luna
...:
Out[11]: array([[0., 1.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
我想我发现了错误。您正在使用 重新缩放训练和测试数据ImageDataGenerator。但在测试单个图像时您并没有这样做。尝试这个:
# Making new Predictions
import numpy as np
from keras.preprocessing import image
test_image_luna = image.load_img('D:\\NR\\data\\live2013\\caps.bmp', target_size=(64,64))
test_image2 = image.img_to_array(test_image_luna)/255.
test_image2 = np.expand_dims(test_image2, axis=0)
luna = classifier.predict_proba(test_image2)
Run Code Online (Sandbox Code Playgroud)
高输入值导致非常高的输出值。由于您使用的是 softmax 激活,这些值会导致预测非常接近 0 和 1。