【发布时间】:2018-12-23 22:55:05
【问题描述】:
我想使用 CNN 对昏昏欲睡和非昏昏欲睡的面孔进行分类。我总共有 28608 张图像(我通过增强创建)。我使用 21456 幅图像进行训练,7152 幅图像用于测试,2000 幅图像用于验证。我得到 accuracy:0.93 和 loss: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('########################################')
【问题讨论】:
-
如果您简化包含的源代码,我会发现它会容易得多。如果与问题无关,您至少应该删除注释代码。提供每个打印命令的准确输出也很有帮助。目前我只能猜测,但您似乎正在将
argmax应用于标量或一维数组的对象。在这种情况下,您会得到 0,因为最大(也是唯一)数字位于第 0 个索引上。 -
另一个基本问题:您的训练样本中有多少显示出昏昏欲睡/不昏昏欲睡的面孔?您是否事先对您的数据拆分进行了任何分析?如果你有一个不平衡的数据集,那也可能是原因......
-
@dennlinger 我有相同数量的困倦和非困倦图像用于训练
标签: python tensorflow machine-learning neural-network conv-neural-network