当前位置: 首页 > 知识库问答 >
问题:

水果图像分类器(Python)

家志学
2023-03-14

我试图用python编码一个水果图像分类器,尝试分类7个水果。我有train_set的15077张图片和validation_set的4204张图片。我编译了10个时代的代码,结果如下:

在15077个样本上进行训练,在4204个样本上进行验证,历元1/10 15077/15077[=============================================]-264s 17ms/步长-损耗:1.0652-精度:0.5325-val损耗:0.3722-val精度:0.8428历元2/10 15077/15077[=============================================================================================================================================================================================-256s 17ms/步-损耗:0.4236-精度:0.8405-瓦卢损耗:0.2910-瓦卢精度:0.9034历元3/1015077/15077[=====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================-243s 16ms/步长-损耗:0.2022-精度:0.9381-瓦卢损耗:0.0985-瓦卢精度:0.9724历元5/1015077/15077[==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================-253s 17ms/步长-损耗:0.1509-精度:0.9529-瓦卢损耗:0.1831-瓦卢精度:0.9317历元7/10 15077/15077[===============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================-255s 17ms/步长-损耗:0.0668-精度:0.9816-val_损耗:0.3004-val_精度:0.9229历元9/1015077/15077[=========================================================================================================================================================================================================================================================================================================================================================================================================-240s 16ms/步-损耗:0.0765-精度:0.9784-瓦卢损耗:0.1763-瓦卢精度:0.9424测试损耗:0.176322709173225测试精度:0.9424358010292053我想知道为什么精度像正弦波?我认为它应该每一个时代都在增长。您对修改代码有什么建议吗?谢谢你的回复。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import cv2
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.layers import LSTM, Input, TimeDistributed
from keras.models import Model
from keras.optimizers import RMSprop, SGD

# Import the backend
from keras import backend as K

dataDirTrain = "C:/Users/TCSEAKIN/Desktop/Py/AI-hack/AI/Training"
dataDirTest = "C:/Users/TCSEAKIN/Desktop/Py/AI-hack/AI/Test"
categories = ["Armut", "Cilek", "Elma_Kirmizi", "Elma_Yesil", "Mandalina", "Muz","Portakal"]


training_data = []
test_data = []

for category in categories:
    path = os.path.join(dataDirTrain, category)
    class_num = categories.index(category)
    for img in os.listdir(path):
        try:
            imgTrainArray = cv2.imread(os.path.join(path,img))
            newTrainArray = cv2.resize(imgTrainArray, (50, 50))
            training_data.append([newTrainArray, class_num])
        except Exception as e:
            pass


for category in categories:
    path = os.path.join(dataDirTest, category)
    class_num = categories.index(category)
    for img in os.listdir(path):
        try:
            imgTestArray = cv2.imread(os.path.join(path,img))
            newTestArray = cv2.resize(imgTestArray, (50, 50))
            test_data.append([newTestArray, class_num])
        except Exception as e:
            pass

X_train = []
x_test = []
y_train = []
y_test = []

for features, label in training_data:
    X_train.append(features)
    y_train.append(label)

for features, label in test_data:
    x_test.append(features)
    y_test.append(label)

X_train = np.array(X_train).reshape(-1, 50, 50, 3)
y_train = np.array(y_train).reshape(-1, 1)

x_test = np.array(x_test).reshape(-1, 50, 50, 3)
y_test = np.array(y_test).reshape(-1, 1)


X_train = X_train/255
x_test = x_test/255

from keras.utils import to_categorical

Y_train_one_hot = to_categorical(y_train)
Y_test_one_hot = to_categorical(y_test)

model_cnn = Sequential()
# First convolutional layer, note the specification of shape
model_cnn.add(Conv2D(64, kernel_size=(3, 3),activation='relu',input_shape=(50, 50, 3)))


model_cnn.add(Conv2D(128, (3, 3), activation='relu'))
model_cnn.add(MaxPooling2D(pool_size=(2, 2)))
model_cnn.add(Conv2D(256, (3, 3), activation='relu'))
model_cnn.add(MaxPooling2D(pool_size=(2, 2)))
model_cnn.add(Dropout(0.5))

model_cnn.add(Flatten())
model_cnn.add(Dense(128, activation='relu'))
model_cnn.add(Dropout(0.5))
model_cnn.add(Dense(64, activation='relu'))
model_cnn.add(Dropout(0.5))
model_cnn.add(Dense(7, activation='softmax'))

model_cnn.compile(loss="categorical_crossentropy",
              optimizer="adam",
              metrics=['accuracy'])

model_cnn.fit(X_train, Y_train_one_hot,
          batch_size=64,
          epochs=10,
          verbose=1,
          validation_data=(x_test, Y_test_one_hot))
score = model_cnn.evaluate(x_test, Y_test_one_hot, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

model_cnn.save("C:/Users/TCSEAKIN/Desktop/Training3.py"

共有2个答案

应和悦
2023-03-14

事实上,这是一种正常的行为。您可以降低您的学习率,以减少训练时期之间的准确性差异(如果需要,请尝试其他优化器)

此外,您应该规范化图像,以提高网络概括知识的能力。在这里,您可以阅读有关规范化的更多信息:https://machinelearningmastery.com/how-to-normalize-center-and-standardize-images-with-the-imagedatagenerator-in-keras/

祁俊拔
2023-03-14

我认为训练的准确性已经很好了。您可以做几件事来提高验证准确性和总体性能

  1. 使用ImageDataGenerator来增强图像以获得更好的模型精度
  2. 使用较低的学习率或自适应教育率。
  3. 更新两行如下所示。最近发现模型末尾的softmax层引入了数值不稳定性。

从中更换这两行

model_cnn.add(Dense(7, activation='softmax'))

model_cnn.compile(loss="categorical_crossentropy",
              optimizer="adam",
              metrics=['accuracy'])

model_cnn.add(Dense(7))

model_cnn.compile(loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              optimizer="adam",
              metrics=['accuracy'])

希望有帮助。

 类似资料:
  • 目标 在本章中, 我们将学习使用分水岭算法实现基于标记的图像分割 我们将看到:cv.watershed() 理论 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升,根据附近的山峰(坡度),来自不同山谷的水明显会开始合并,颜色也不同。为了避免这种情况,你要在水融合的地方建造屏障。你继续填满水,建造障

  • 我试图建立自定义的水平滚动视图画廊,而不是使用android b/c中的画廊小工具,它在api 16中已被否决。我可以在滚动视图中添加图像,但当用户在水平滚动视图中单击相应的缩略图时,我如何更改较大的图像视图。这是代码

  • 目标 在这一章当中, 我们将学习使用基于标记的分水岭算法来进行图像分割 我们将看到:cv2.watershed() 理论基础 任何灰度图像可以被看作是一个地形表面,其中高强度表示峰和山,而低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位上升,根据附近的山峰(梯度),来自不同山谷的水,明显不同的颜色将开始合并。为了避免这种情况,你在水合并的地方建立障碍。你继续填

  • 在Struts2应用程序中,我尝试使用Custome结果类型。但是我没有得到任何效果,我的JSP页面图像的动作没有得到调用。而且也没有例外得到。请纠正我哪里做错了。HTTPFox说404,但我在JAVA控制台没有得到任何东西。 HTML: XML:

  • 本文向大家介绍ibm-watson-cognitive 分类图像,包括了ibm-watson-cognitive 分类图像的使用技巧和注意事项,需要的朋友参考一下 示例 先决条件 首先,您必须安装watson-developer-cloudSDK。 分类图片网址 我们将使用维基百科上的美国队长形象。            

  • 问题内容: 我正在尝试使用CSS将图像水平居中放置。 我正在使用以下HTML代码在屏幕上显示图像: 我正在裁剪图像,因为我只想显示一些图像,并且正在使用以下CSS: 但是,一旦裁切后,我将无法确定如何居中。 有人能帮忙吗? 问题答案: 这样使用绝对位置和保证金位置