图片预测错误

Val*_*itz 2 python keras tensorflow

简而言之, 我将使用我的数据集开始与Keras合作。当我尝试加载模型并在测试图像上进行测试时,尽管先前的训练状态输出仍仅为77%,但我仅获得一个类别。您能否指出,预测代码中配置错误的内容是什么?

详细描述: 数据集是标记的生物细胞,灰度为64x64。有两种类型的单元格p和c。我按照cat / dogs示例中的建议创建了数据集目录。分别使用panca,canca进行培训,测试和val目录。canca,canca目录包含图像。例如:

train-panca-<images>
train-canca-<images>
Run Code Online (Sandbox Code Playgroud)

我也主要从cat / dog示例中获取了代码,并更改了图像大小。

运行代码后,我获得输出:

...
80/80 [==============================] - 8s 101ms/step - loss: 0.2995 - acc: 0.8910 - val_loss: 0.5150 - val_acc: 0.7560

Using TensorFlow backend.
Finished saving
Test loss: 0.46428223699331284
Test accuracy: 0.7759999990463257
Run Code Online (Sandbox Code Playgroud)

这看起来是合理且有希望的-很少的数据和短的培训时间(约3分钟)的77%的准确性令人难以置信。我还测试了用火车目录替换测试目录,并获得了> 90%的准确性。因此该模型看起来很实用。

但是,当我尝试加载它并在测试图像上进行测试时,我只能获得一个类。

火车

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K


# dimensions of the images.
img_width, img_height = 64, 64

train_dir = 'c:/tmp/anca_pc/train'
val_dir = 'c:/tmp/anca_pc/val'
test_dir = 'c:/tmp/anca_pc/test'

nb_train_samples = 2000
nb_validation_samples = 500
nb_test_samples = 500

epochs = 5
batch_size = 25

#Is right got gray-scale images? Shouldn't be 1 instead of 3
if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

#Define model as proposed in keras tutorials
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

datagen = ImageDataGenerator( rescale=1. / 255 )

train_generator = datagen.flow_from_directory(
    train_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = datagen.flow_from_directory(
    val_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

test_generator = datagen.flow_from_directory(
    test_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

#Save model architecture
model_json = model.to_json()
json_file = open("anca_pc.json", "w")
json_file.write(model_json)
json_file.close()

#Save model weights
model.save_weights("anca_pc.h5")
print("Finished saving")

score = model.evaluate_generator(test_generator, nb_test_samples // batch_size)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
print('Scode', score)
Run Code Online (Sandbox Code Playgroud)

预测

import numpy as np
from keras.models import model_from_json
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import matplotlib.pyplot as plt
from scipy.misc import toimage
import os


classes = ['panca', 'canca']
directory = 'C:/tmp/anca_pc/test/'

json_file = open("anca_pc.json", "r")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("anca_pc.h5")

loaded_model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

for c in classes:
    aktdir=directory+c
    print(aktdir)
    for filename in os.listdir(aktdir):
        fn=os.path.join(aktdir, filename)
        #print(fn)
        img = image.load_img(fn, target_size=(64, 64))
        #plt.imshow(img)
        #plt.show()

        x = image.img_to_array(img)
        x = x.astype('float32')
        x /= 255
        x = np.expand_dims(x, axis=0)
        #x = preprocess_input(x)

        prediction = loaded_model.predict(x)

        #print(prediction)
        print(c + " : " + classes[np.argmax(prediction)], " : ", prediction)
Run Code Online (Sandbox Code Playgroud)

model.predict_generator(test_generator, nb_test_samples // batch_size)以3个时间 段运行的EDIT得分输出

Test loss: 0.5996998563408852
Test accuracy: 0.7060000032186509
Score [[0.72468185]
 [0.07171335]
 [0.06702321]
 [0.04176971]
 [0.76247555]
 [0.07743845]
 [0.07435916]
 [0.9960306 ]
 [0.9270018 ]
 [0.04746262]
 [0.05305129]
 [0.9993339 ]
 [0.9986149 ]
 [0.63527316]
 [0.08033804]
 [0.3816172 ]
 [0.97601706]
 [0.83666223]
 [0.7226989 ]
 [0.5351326 ]
 [0.8407803 ]
 [0.6953097 ]
 [0.89651984]
 [0.44985726]
 [0.30889446]
 [0.16406931]
 [0.6346773 ]
 [0.13678996]
 [0.51343983]
 [0.97438985]
 [0.9981396 ]
 [0.5485193 ]
 [0.05270131]
 [0.8029713 ]
 [0.3295382 ]
 [0.1865853 ]
 [0.94497275]
 [0.07609159]
 [0.67434824]
 [0.18562992]
 [0.53442085]
 [0.06662691]
 [0.0388172 ]
 [0.8763066 ]
 [0.9875164 ]
 ...
Run Code Online (Sandbox Code Playgroud)

sla*_*mic 5

np.argmax(prediction)将始终返回0,因为预测仅包含一个值。

由于您具有二进制输出,因此需要将np.argmax替换为以下内容:

def get_class(prediction):
  return 1 if prediction > 0.5 else 0
Run Code Online (Sandbox Code Playgroud)