【发布时间】:2021-03-20 11:13:40
【问题描述】:
我是 tensorflow 新手,正在尝试构建一个模型来对两类图像进行分类。
验证准确率在 12 个 epoch 后达到 98%(这似乎异常高)。预测时总是输出:[[1.]],不管输入的图片是什么
加载数据:
import numpy as np
import os
import cv2
from tqdm import tqdm
import random
import pickle
dataDir = "C:/optimised_dataset"
categories = ["demented", "healthy"]
IMG_WIDTH = 44
IMG_HEIGHT = 52
lim = 0
training_data = []
def create_training_data():
for category in categories:
path = os.path.join(dataDir, category) # path to demented or healthy dir
class_num = categories.index(category)
lim = 0
for img in tqdm(os.listdir(path)):
if lim < 3000:
try:
img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(img_array, (IMG_WIDTH, IMG_HEIGHT))
training_data.append([new_array, class_num])
lim+=1
except Exception as e:
pass
else:
break
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).reshape(-1, IMG_WIDTH, IMG_HEIGHT, 1)
Y = np.array(Y)
pickle_out = open("X.pickle", "wb")
pickle.dump(X, pickle_out)
pickle_out.close()
pickle_out = open("Y.pickle", "wb")
pickle.dump(Y, pickle_out)
pickle_out.close()
型号:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Flatten, Conv2D, MaxPool2D
import pickle
import numpy as np
X = pickle.load(open("X.pickle", "rb"))
Y = pickle.load(open("Y.pickle", "rb"))
X = np.array(X)
X = X/255.0
Y = np.array(Y)
model = Sequential()
model.add(Conv2D(64, (3,3), input_shape=X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Conv2D(64, (3,3)))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation("relu"))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss="binary_crossentropy",
optimizer="adam",
metrics=['accuracy'])
model.fit(X, Y, batch_size=32, epochs=18, validation_split=0.1)
model.save('DD1.model')
预测:
import cv2
import tensorflow as tf
categories = ["demented", "healthy"]
def prepare(filepath):
IMG_WIDTH = 44
IMG_HEIGHT = 52
img_array = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
img_array = img_array / 255.0
new_array = cv2.resize(img_array, (IMG_WIDTH, IMG_HEIGHT))
return new_array.reshape(-1, IMG_WIDTH, IMG_HEIGHT, 1)
model = tf.keras.models.load_model("DD1.model")
prediction = model.predict([prepare('D:/test.png')])
print(prediction)
当我删除 img_array = img_array / 255.0 时,它会输出一个介于 0 和 1 之间的看似随机的小数。
【问题讨论】:
-
检查您的数据是否高度不平衡。
-
hmm .. 我用另一个数据集替换了数据,并且有效。但我不明白为什么我的原始数据会产生 98% 的验证准确度
标签: tensorflow machine-learning keras image-classification