错误预测cnn(Dogs Vs Cat)Keras

时间:2018-04-03 14:55:28

标签: python-3.x deep-learning keras convolution

我在keras中编程了卷积神经网络,以预测图像是猫还是狗。 我的准确度大约为80%。 我尝试检查我的代码对许多图像的预测,因为它总是给出预测的类(狗和猫)中的一个类的结果。

我将引导您完成我的代码:

我的代码的第一部分是数据准备:

#Labels
Y = np.concatenate([np.array([[1,0]]*len(cats)), 
                    np.array([[0,1]]*len(dogs))])
print(Y)

#Features
import scipy.misc
from keras.models import model_from_json
X=[]
for name in cats:
    converted_image =  scipy.misc.imresize(scipy.misc.imread(name), (64, 64))                   
    X.append(converted_image)
for name in dogs:
    converted_image = scipy.misc.imresize(scipy.misc.imread(name), (64, 64))
    X.append(converted_image)


X= np.array(X)
print(len(X))
print(X.shape)

现在我已将数据分为培训和测试

from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.10,random_state=10)
X_train=X_train.astype("float32")
X_test = X_test.astype("float32")
print("Shape Of the Training Features are :",X_train.shape)
print("Shape Of Testing Features are  :",X_test.shape)
print("Number of Training Samples : ",X_train.shape[0])
print("Number of Testing Samples :",X_test.shape[0])

现在,我将在下面展示我完整的CNN架构:

from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation,Lambda,Flatten
from keras.layers import Conv2D,MaxPooling2D

def layer(input_shape = (64,64,3)):
    model=Sequential()
    model.add(Lambda(lambda x: x/127.5 - 1.,input_shape=input_shape, output_shape=input_shape))
    model.add(Conv2D(32, (3, 3), activation='relu', name='conv1', input_shape=input_shape, padding="valid"))
    model.add(Conv2D(64,(3,3),activation='relu',name='conv2',padding='valid'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(128,(3,3),activation='relu',name='conv3',padding='valid'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    #model.add(Dense(25088,activation='relu'))
    #model.add(Dense(12000,activation='relu'))
    #model.add(Dense(6000,activation='relu'))
    model.add(Dense(500,activation='relu'))
    model.add(Dense(2,activation='softmax'))
    model.summary()
    return model
model = layer()
model.compile(loss='mse',optimizer='adadelta',metrics=['accuracy'])

model.fit(X_train, Y_train, batch_size=128, epochs=5, verbose=1, validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

我的输出准确度和分数如下: 考试成绩:0.1459069953918457 测试精度:0.7876

- 保存并加载型号代码

#saving
model_json = model.to_json()
open('cd.json','w').write(model_json)
#Save Weights
model.save_weights('cd_weights.h5',overwrite=True)

#loading
model_architecture = 'cd.json'
model_weights = 'cd_weights.h5'
model = model_from_json(open(model_architecture).read())
model.load_weights(model_weights)

现在预测部分

img_names = ['d1.jpg','c1.jpg']
imgs = [np.transpose(scipy.misc.imresize(scipy.misc.imread(img_name), (64, 64)),
                     (1, 0, 2)).astype('float32')
           for img_name in img_names]
imgs = np.array(imgs) / 255

# train
optim = SGD()
model.compile(loss='categorical_crossentropy', optimizer=optim,
    metrics=['accuracy'])

predictions = model.predict_classes(imgs)
print(predictions)

输出:[0 0] 图像来自训练集c1-cat,d1-dog,对于每个图像,它按预测输出零。

1 个答案:

答案 0 :(得分:0)

我认为model.predict_classes()函数存在一些问题。 您可以使用以下代码执行与model.predict_classes()相同的操作。

这将为我们提供概率预测。

predictions = model.predict(imgs)

例如: 1)[0.7865448 0.21910465]说有78%的机会成为第一类(猫),21%的机会是第二类(狗) 2)[0.7856076 0.22000787]说有78%的机会成为第一类(猫),21%的机会成为第二类(狗)

为了将这种概率转换为类,我们使用np.argmax函数。

print(np.argmax(predictions ))

你的输出将是0表示头等(猫)                  或1指示第二类(狗)