【问题标题】:TensorFlow Image Classifier Returns the Same Label for each ImageTensorFlow 图像分类器为每个图像返回相同的标签
【发布时间】:2020-02-04 07:42:33
【问题描述】:

我根据https://blog.francium.tech/build-your-own-image-classifier-with-tensorflow-and-keras-dc147a15e38e 的教程制作了一个图像分类器来对飞机和火箭的图像进行分类。我已经编写了所有代码,它似乎可以正常运行,除了用于标记测试图像时,它使用相同的类标记它们。

我查看了上面网页上的代码,它似乎与我的匹配。

这是我的代码。我已经包括了所有这些,因为我不知道问题出在哪里:

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)

我希望程序在测试文件夹中绘制每个图像以及预测的标签,但相反,它为每个图像都绘制了相同的标签,“飞机”或“火箭”。

【问题讨论】:

    标签: python tensorflow machine-learning keras tf.keras


    【解决方案1】:

    错误是由这一行引起的,if np.argmax(model_out == 1):。请将其更改为if np.argmax(model_out) == 1:。在您发布的博客中,它们是第二个。

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2018-06-30
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2020-05-10
      • 2016-08-23
      • 2015-07-21
      相关资源
      最近更新 更多