几天前,我开始使用ML,因为我想做一个hcaptcha求解器。我已经准备好了一切,我只需要训练一个模型,对captcha图像进行分类,这样我就可以发送一个带有好答案的请求,并获得captcha令牌。
我已经查阅了一些关于如何用几个类训练我自己的模型的教程。我有以下方式:
1个培训师文件夹、1个验证文件夹和1个测试文件夹。在教练机和验证文件夹中有更多的子文件夹,分别命名为飞机、卡车、船、火车,。。。每个包含大约20个图像。在测试文件夹上,一些随机的图像与我的类有关。
我已经训练好了模型,看起来我的准确率是1。然后我得到一些随机测试图像,并尝试使用这个保存的模型来预测它们。它完成它的工作并预测它们,返回一组数字。问题是,我不知道如何解码这些预测,也不知道如何在预测之前查看带有其代表性整数的类列表。
我是这方面的新手,所以我相信任何事情都会有所帮助:(
我下面的代码:
import os
from keras.preprocessing import image
from keras.models import Sequential
from keras import layers
from keras.models import load_model
import numpy as np
trainer_path = "./img/trainer"
validator_path = "./img/validator"
testing_path = "./img/tester"
WIDTH = 128
HEIGHT = 128
BATCH = 30
EPOCHS = 15
train_dataset = image.image_dataset_from_directory(
trainer_path,
label_mode="int",
batch_size=BATCH,
image_size=(WIDTH, HEIGHT)
)
validator_dataset = image.image_dataset_from_directory(
validator_path,
label_mode="int",
batch_size=BATCH,
image_size=(WIDTH, HEIGHT)
)
model = Sequential([
layers.Input((WIDTH, HEIGHT, 3)),
layers.Conv2D(16, 3, padding="same"),
layers.Conv2D(32, 3, padding="same"),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(10)
])
model.compile(
optimizer="adam",
loss=[
"sparse_categorical_crossentropy"
],
metrics=["accuracy"]
)
model_fit = model.fit(
train_dataset,
epochs=EPOCHS,
validation_data=validator_dataset,
verbose=2
)
#loading the saved model
model = load_model("./model")
for i in os.listdir(testing_path):
img = image.load_img(testing_path + "/" + i, target_size=(WIDTH, HEIGHT, 3))
img_array = image.img_to_array(img)
img_batch = np.expand_dims(img_array, axis=0)
prediction = model.predict(img_batch)
print(prediction)
print()
输出示例:
[[ 875.5614 3123.8257 1521.7046 90.056526 335.5274
-785.3671 1075.9199 1105.3068 -14.917503 -3745.6494 ]]
你必须在最后一个密集层上应用激活函数,如果你想对图像进行分类,它应该是softmax(你会得到所有类别的概率(,这里是链接:
https://keras.io/api/layers/activations/
当涉及到类名时,它应该按字母数字值排序,你也可以传递class_names
参数,这里是这个函数的参数链接:
https://www.tensorflow.org/api_docs/python/tf/keras/utils/image_dataset_from_directory