簡體   English   中英

TensorFlow 圖像分類器為每個圖像返回相同的 Label

[英]TensorFlow Image Classifier Returns the Same Label for each Image

我根據https://blog.francium.tech/build-your-own-image-classifier-with-tensorflow-and-keras-dc147a15e38e上的教程制作了一個圖像分類器來對飛機和火箭的圖像進行分類。 我已經編寫了所有代碼,它通常顯示在 function 中,除了用於 label 測試圖像時,它使用相同的 class 標記它們。

我查看了上面網頁上的代碼,它似乎與我的匹配。

這是我的代碼。 我已經包括了所有這些,因為我不知道問題出在哪里:

import cv2
import numpy as np
import os
from random import shuffle
from tqdm import tqdm
import tensorflow as tf
from PIL import Image
import matplotlib.image as mpimg

from keras.models import Sequential
from keras.layers import *
from keras.optimizers import *
import matplotlib.pyplot as plt
#%matplotlib inline
import cv2

train_data = "C:/Users/Will Downs/image_training/training_data/"
test_data = "C:/Users/Will Downs/image_training/test_data/"

def one_hot_label(img):
  ohl = np.array([0, 0])
  label = img.split('.')[0]
  if label == 'Airplane':
     ohl = np.array([1,0])
  elif label == 'Rocket':
     ohl = np.array([0,1])
  return ohl

#This section loads and prepares the training and testing images:
def train_data_with_label():
  train_images = []
  for i in tqdm(os.listdir(train_data)):
    path = os.path.join(train_data, i)
    img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
    img = cv2.resize(img, (64,64))
    train_images.append([np.array(img), one_hot_label(i)])
  shuffle(train_images)
  return train_images

def test_data_with_label():
  test_images = []
  for i in tqdm(os.listdir(test_data)):
    path = os.path.join(test_data, i)
    img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
    img = cv2.resize(img, (64,64))
    test_images.append([np.array(img), one_hot_label(i)])
  shuffle(test_images)
  return test_images

#This section trains the model
training_images = train_data_with_label()
testing_images = test_data_with_label()
tr_img_data = np.array([i[0] for i in training_images]).reshape(-1,64,64,1)
tr_lbl_data = np.array([i[1] for i in training_images])

tst_img_data = np.array([i[0] for i in testing_images]).reshape(-1,64,64,1)
tst_lbl_data = np.array([i[1] for i in testing_images])

model = Sequential()

model.add(InputLayer(input_shape=[64,64,1]))
model.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(2,activation='softmax'))
optimizer = Adam(lr=1e-3)

model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=tr_img_data, y=tr_lbl_data, epochs=50,batch_size=100)
model.summary()

#This section plots and labels the images
fig = plt.figure(figsize=(14,14))

for cnt, data in enumerate(testing_images[2:4]):

    y = fig.add_subplot(6,5, cnt+1)
    img = data[0]
    data = img.reshape(1,64,64,1)
    model_out = model.predict([data])

    if np.argmax(model_out == 1):
        str_label = "Airplane"
    else:
        str_label = "Rocket"

    y.imshow(img, cmap="gray")
    plt.title(str_label)
    y.axes.get_xaxis().set_visible(False)
    y.axes.get_yaxis().set_visible(False)

我希望程序 plot 測試文件夾中的每個圖像以及預測的 label,但是相反,它使用相同的 label 繪制每個圖像,或者“Airplane”或“Rocket。

該錯誤是由這一行引起的, if np.argmax(model_out == 1): 請將其更改為if np.argmax(model_out) == 1: 在您發布的博客中,它們是第二個。

暫無
暫無

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

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