【发布时间】: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