Python 我的图像分类模型是用tensorflow don';我学不会
我正在尝试建立一个图像分类模型来预测你是否戴着面具。这是我第一次做自己的模型,当我训练它时,准确率跳到50%左右,如果我预测它总是说“没有面具”,我尝试改变epoche的数量、批量大小、训练数据的数量改变模型代码,但什么都不起作用。这是我的代码:Python 我的图像分类模型是用tensorflow don';我学不会,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我正在尝试建立一个图像分类模型来预测你是否戴着面具。这是我第一次做自己的模型,当我训练它时,准确率跳到50%左右,如果我预测它总是说“没有面具”,我尝试改变epoche的数量、批量大小、训练数据的数量改变模型代码,但什么都不起作用。这是我的代码: import os import cv2 import random import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.lay
import os
import cv2
import random
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten,Dropout
from tensorflow.keras.optimizers import SGD
def preproccesImage(img):
img = cv2.resize(img,dsize=(150,150 ), interpolation = cv2.INTER_CUBIC)
return img
def getData():
training = []
for image in os.listdir("src/data/with_mask"):
img = cv2.imread(f"src/data/with_mask/{image}",cv2.IMREAD_GRAYSCALE)
proccesed = preproccesImage(img)
training.append([proccesed.tolist(),1])
for image in os.listdir("src/data/without_mask"):
img = cv2.imread(f"src/data/without_mask/{image}",cv2.IMREAD_GRAYSCALE)
proccesed = preproccesImage(img)
training.append([proccesed.tolist(),0])
random.shuffle(training)
train_x = np.array([x[0] for x in training],dtype=np.float32)
train_y = np.array([x[1] for x in training],dtype=np.float32)
print(train_x)
print(train_y)
return (train_x ,train_y)
train_x , train_y = getData()
model = Sequential()
model.add(Dense(32,input_shape=(len(train_x[0]),150),activation="relu"))
model.add(Flatten())
model.add(Dense(128,activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(128,activation="relu"))
model.add(Flatten())
model.add(Dense(1,activation="softmax"))
model.compile(loss="categorical_crossentropy",
optimizer="adam", metrics=["accuracy"])
hist = model.fit(
train_x,train_y,
epochs=200, batch_size=2, verbose=1)
model.save("model.h5", hist)
img = cv2.imread("src/me.png",cv2.IMREAD_GRAYSCALE)
resized = cv2.resize(img,dsize=(150,150 ), interpolation = cv2.INTER_CUBIC)
def predict():
res = model.predict([resized.tolist()])[0]
resoult = [[i, r] for i, r in enumerate(res)]
predicted = []
for r in resoult:
predicted.append({"intent": 1 if r[0] == 1 else 0, "probability": r[1]})
if predicted[0]["intent"] == 1:
print("mask on")
else:
print('no mask')
predict()
如果有人能帮忙,我会很高兴的这不是二进制分类的正确组合;您应该将您的损失更改为
binary\u crossentropy
,并将最后一层的激活更改为sigmoid
,即:
model.add(Dense(1,activation="sigmoid")) # last layer
model.compile(loss="binary_crossentropy",
optimizer="adam", metrics=["accuracy"])
更一般地说,在模型的早期阶段,您确实可以从一些卷积层中获益;还要注意的是,将
展平
层放置在密集
层之后没有任何意义。现在精度提高了,但我仍然一直在获得“无遮罩”