我用 tensorflow 编写的图像分类模型不学习

时间:2021-02-07 12:00:14

标签: python tensorflow machine-learning keras

我正在尝试构建图像分类模型,该模型将预测您是否戴口罩。这是我第一次制作自己的模型,当我训练它时,准确度跃升 50%,如果我预测它总是说“不掩码”我尝试改变时代的数量,批量大小,改变模型代码的训练数据数量,但没有任何效果。这是我的代码:

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()

如果有人能帮忙,我会很高兴

1 个答案:

答案 0 :(得分:1)

这不是二元分类的正确组合;您应该将损失更改为 binary_crossentropy 并将最后一层的激活更改为 sigmoid,即:

model.add(Dense(1,activation="sigmoid"))  # last layer

model.compile(loss="binary_crossentropy",
              optimizer="adam", metrics=["accuracy"])

更一般地说,在模型的早期阶段,您确实可以从一些卷积层中受益;另请注意,在 Flatten 层之后放置 Dense 层没有任何意义。