簡體   English   中英

為什么我的神經網絡總是預測 0

[英]Why does my Neural Network always predict 0

我想使用 CNN 對昏昏欲睡和非昏昏欲睡的人臉進行分類。 我總共有 28608 張圖像(我通過擴充創建的)。 我使用 21456 張圖像進行訓練,7152 張用於測試,2000 張用於驗證。 我得到的准確度:0.93 和損失:0.17

但是當我嘗試從測試數據中隨機預測一些圖像時,它總是給出 0。

有人可以幫我解決這個問題嗎?

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
import random
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

from sklearn.model_selection import train_test_split

print(tf.__version__)

DATADIR ="D:\\s1\\DATA"

CATEGORIES = ["D", "ND"]
IMG_SIZE = 50

training_data = []
#############################################################  0=Drowsy 1=NonDrowsy
def create_training_data():
    for category in CATEGORIES:  # do D and ND

        path = os.path.join(DATADIR,category)  # create path to D and ND
        class_num = CATEGORIES.index(category)  # get the classification  (0 or a 1). 0=D 1=ND

        for img in os.listdir(path):  # iterate over each image per D and ND
            try:
                img_array = cv2.imread(os.path.join(path,img) ,0)  # convert to array
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])  # add this to  training_data
            except Exception as e:  # in the interest in keeping the output clean...
                pass

create_training_data()

random.shuffle(training_data)

x=[]
y=[]

for features,label in training_data:
    x.append(features)
    y.append(label)

x = np.array(x)
y = np.array(y)


####################################################################

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42)


####################################

X_train = X_train / 255.0
X_test = X_test / 255.0


X_train = X_train.reshape(X_train.shape[0], IMG_SIZE, IMG_SIZE, 1)
X_test = X_test.reshape(X_test.shape[0], IMG_SIZE, IMG_SIZE, 1)


model = keras.Sequential()

model.add(keras.layers.Conv2D(32, (3, 3), activation='relu',input_shape=(IMG_SIZE, IMG_SIZE, 1)))
model.add(keras.layers.Conv2D(32, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.25))

model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.25))

model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(256, activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(1, activation='sigmoid'))

model.summary()
model.compile(optimizer=tf.train.AdamOptimizer(),loss='binary_crossentropy',metrics=['accuracy'])

#Validation set
x_val = X_train[:2000]
partial_x_train = X_train[2000:]

y_val = y_train[:2000]
partial_y_train = y_train[2000:]

history = model.fit(partial_x_train, partial_y_train, epochs=5,batch_size=100, validation_data=(x_val, y_val),verbose=1)
###########
results = model.evaluate(X_test, y_test)
print(results)
################


for i in range(6):
    print(i)
    img1 = X_test[i]
    print(img1.shape)
    img1 = (np.expand_dims(img1,0))
    print(img1.shape)

    print('actual label')
    print(y_test[i])


    predictions_single = model.predict(img1)
    print('predicted label')

    print(predictions_single)
    print(np.argmax(predictions_single[0]))
    print('########################################')
    print('########################################')

與其嘗試保持列表training_data完全全局,並且函數create_training_data()期望從內部更新它, create_training_data()嘗試在函數中完全創建它並返回它:

#############################################################  0=Drowsy 1=NonDrowsy
def create_training_data():

    training_data = []

    for category in CATEGORIES:  # do D and ND
        path = os.path.join(DATADIR,category)  # create path to D and ND
        class_num = CATEGORIES.index(category)  # get the classification  (0 or a 1). 0=D 1=ND
        for img in os.listdir(path):  # iterate over each image per D and ND
            try:
                img_array = cv2.imread(os.path.join(path,img) ,0)  # convert to array
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])  # add this to  training_data
            except Exception as e:  # in the interest in keeping the output clean...
                pass

    return training_data


training_data = create_training_data() 

您可能還需要考慮將其他變量作為參數傳遞到您的函數中,以避免出現類似問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM