ConvNet具有98%的测试准确度,在预测时总是错误的

Sam*_*ara 3 python machine-learning deep-learning keras tensorflow

我目前正在构建一个卷积神经网络,以区分清晰的ECG图像和ECG图像与噪声.

有噪音:

使用噪声样本心电图图像

没有噪音:

无噪声样本心电图图像

我的问题

因此,我确实使用了高于tensorflow的keras构建了一个convnet,并对其进行了多次训练,但始终如此,它具有99%的训练准确度,99%的验证准确度和98%的测试精度.但是当我预测一张图片时,它总是会给我[0].

培训,验证和测试的准确性

大多数时候,我的模型早期停留在3或4纪元,在训练和验证方面都有99%的准确率.几乎所有的时间在第一纪元或第二纪元都给出了98%或99%的准确度.

我的模特

from keras.models import Sequential
from keras.datasets import mnist
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation,Dropout,Flatten,Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import TensorBoard
from keras.layers import ZeroPadding2D
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping

tensorboard = TensorBoard(log_dir="./logs",histogram_freq=0,write_graph=True,write_images=True)
earlystop = EarlyStopping(monitor='val_loss',patience=2,verbose=1)

# Variables
batchSize = 15
num_of_samples = 15000
num_of_testing_samples = 3750
num_of_val_samples = 2000

training_imGenProp = ImageDataGenerator(rescale = 1./255,
                                width_shift_range=0.02,
                                height_shift_range=0.02,
                                horizontal_flip=False,
                                fill_mode='nearest'
                                )   

testing_imGenProp = ImageDataGenerator(
                                rotation_range=5,
                                horizontal_flip=False,
                                fill_mode='nearest'
                                )

val_imGenProp = ImageDataGenerator(rescale = 1./255,
                                rotation_range=5,
                                zoom_range=0.2,
                                horizontal_flip=False,
                                fill_mode='nearest'
                                )                                    



# Create the model                                    
classifier = Sequential()
classifier.add(ZeroPadding2D(padding=(374,0),input_shape=(74,448,3)))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))

classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dropout(0.8))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.summary()

adam = Adam(lr=0.00005)
classifier.compile(loss='binary_crossentropy',optimizer=adam,metrics=['accuracy'])

training_imGen = training_imGenProp.flow_from_directory(
                                'Directory\Training',
                                target_size=(74,448),
                                batch_size=batchSize,
                                class_mode='binary',

                                )

testing_imGen = testing_imGenProp.flow_from_directory(
                                'Directory\Testing',
                                target_size=(74,448),
                                batch_size=batchSize,
                                class_mode='binary',

                                )   

val_imGen = testing_imGenProp.flow_from_directory(
                                'Directory\Validation', 
                                target_size=(74,448),
                                batch_size=batchSize,
                                class_mode='binary',

                                )                                   

classifier.fit_generator(
                            training_imGen,
                            callbacks = [tensorboard,earlystop], 
                            steps_per_epoch=num_of_samples // batchSize,
                            epochs=30, 
                            validation_data = val_imGen,
                            validation_steps = num_of_val_samples // batchSize
                         ) 

score, acc = classifier.evaluate_generator(
                        testing_imGen,
                        num_of_testing_samples // batchSize,
                        verbose = 0
                    )     
print('Test score:', score)
print('Test accuracy:', acc)
classifier.save('Directory\Config_10_Model.h5')
Run Code Online (Sandbox Code Playgroud)

笔记

我使用0.0005学习率来阻止这个模型在第2或第3纪元提前停止.此外,我在三个文件夹下分别进行了训练,测试和验证的图像,并分别有1020,375,200个图像用于训练,测试和验证(这意味着单独的Training文件夹有2040个图像,因为我有两个类.每个类都有相同数量的图像).因此,在任何情况下都不会重复使用任何图像.

此外,在我在ImageDataGenerator中通过1./255重新缩放图像之前,我的模型在训练,验证和54%的测试中具有50%的准确性.但在使用重新缩放后,这种早期停止经常发生,几乎所有时间的准确率都达到了99%.

我没有故意使用重新缩放测试图像.但仍然可以获得98%的准确率,但却无法拼命预测.由于我with noisewithout noise培训文件夹下的文件夹,我的输出类应该是噪音或没有噪音.由于Noise首先按字母顺序排列,我相信[0]课程应该是,With Noise并且[1]应该是Without Noise.但如果我输入没有噪声图像的模型,它仍然给了我[0].

下面是我用来预测训练模型的代码.

from keras.models import load_model
import numpy as np
from keras.preprocessing import image

model = load_model('Directory\Config_10_Model.h5')

test_image = image.load_img('Path_to_Without_Noise_Image\image3452.png', target_size = (74, 448))
test_image = image.img_to_array(test_image)
test_image = test_image/255
test_image = np.expand_dims(test_image, axis = 0)
result = model.predict(test_image)
y_classes = result.argmax(axis=-1)
print(y_classes)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会发生这种情况,即使我从未使用相同的图像进行测试,验证或培训.有人可以帮我弄这个吗?我尝试了一切并训练了具有不同超参数的模型,但每次都是这个模型输出[0].

sat*_*hyz 8

你正在做二进制分类.result有形状[batch_size,1].所以,如果你这样做,argmax()你将永远得到0.

>>> import numpy as np
>>> result = np.random.rand(5,1)
>>> result
array([[ 0.54719484],
       [ 0.31675804],
       [ 0.55151251],
       [ 0.25014937],
       [ 0.00724972]])
>>> result.argmax(axis=-1)
array([0, 0, 0, 0, 0])
>>> (result > 0.5).astype(int)
array([[1],
       [0],
       [1],
       [0],
       [0]])
>>>
Run Code Online (Sandbox Code Playgroud)