gpt4 book ai didi

python - 为什么这个 CNN 脚本无法正确预测?

转载 作者:行者123 更新时间:2023-11-30 09:33:34 25 4
gpt4 key购买 nike

我对 Python 和机器学习都很陌生,我正在开发我的第一个真正的图像识别项目。它基于 this tutorial它只有两个分类(猫或狗)并且有更多的数据。尽管如此,我并没有让我的多类脚本在正确预测方面发挥作用,而主要是如何对脚本进行故障排除。该脚本远不能正确预测。

Examples of domino images in the training data

下面是脚本。数据/图像由 7 个文件夹组成,每个文件夹约有 10-15 张图像。这些图像是 100x100 像素的不同多米诺骨牌图 block ,一个文件夹只是婴儿照片(主要作为对照组,因为它们与多米诺骨牌照片非常不同):

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.models import model_from_json
import numpy
import os

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32, (25, 25), input_shape = (100, 100, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Conv2D(32, (25, 25), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 7, activation = 'sigmoid')) # 7 units equals amount of output categories

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])


# Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size = (100, 100),
batch_size = 32,
class_mode = 'categorical')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size = (100, 100),
batch_size = 32,
class_mode = 'categorical')
classifier.fit_generator(training_set,
steps_per_epoch = 168,
epochs = 35,
validation_data = test_set,
validation_steps = 3)
classifier.summary()

# serialize weights to HDF5
classifier.save_weights("dominoweights.h5")
print("Saved model to disk")

# Part 3 - Making new predictions
import numpy as np
from keras.preprocessing import image

path = 'dataset/prediction_images/' # Folder with my images
for filename in os.listdir(path):
if "jpg" in filename:
test_image = image.load_img(path + filename, target_size = (100, 100))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
print result
training_set.class_indices
folder = training_set.class_indices.keys()[(result[0].argmax())] # Get the index of the highest predicted value
if folder == '1':
prediction = '1x3'
elif folder == '2':
prediction = '1x8'
elif folder == '3':
prediction = 'Baby'
elif folder == '4':
prediction = '5x7'
elif folder == '5':
prediction = 'Upside down'
elif folder == '6':
prediction = '2x3'
elif folder == '7':
prediction = '0x0'
else:
prediction = 'Unknown'
print "Prediction: " + filename + " seems to be " + prediction
else:
print "DSSTORE"
print "\n"

说明:

  • 训练数据:每个类别大约有 10-15 张图像。总共有 168 个训练图像
  • 测试数据:每个类别各 3 张图像
  • dataset/prediction_images/ 包含脚本将预测的大约 10 个不同图像
  • result 通常输出 array([[0., 0., 1., 0., 0., 0., 0.]], dtype=float32)

我的问题

我的主要问题是:您认为脚本有什么特别错误的地方吗?或者,脚本是否应该正常工作,而只是缺乏数据导致预测错误?

子问题:

  1. 我对卷积层的理解是否正确,有一个 25x25px 的窗口可以扫描图像。我尝试了“默认”3x3px 但结果相同?
  2. 卷积层中的数字32。它指的是 32 位图像吗?
  3. 有2个卷积层正常吗?我真的不明白为什么需要它。
  4. 整个部分:

    classifier.fit_generator(training_set,
    steps_per_epoch = 168,
    纪元 = 35,
    validation_data = test_set,
    validation_steps = 3)

让我困惑。据我了解,steps_per_epoch应该是我拥有的训练图像的数量。那是对的吗? epochs 是 CNN 的迭代次数吗?

  • 我不明白为什么需要这段代码:

    从 keras.preprocessing.image 导入 ImageDataGenerator
    train_datagen = ImageDataGenerator(rescale = 1./255,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizo​​ntal_flip = True)
    test_datagen = ImageDataGenerator(rescale = 1./255)

  • 在我看来,它正在创建图像的副本/版本,放大它们,翻转它们等。为什么需要这样做?

    任何关于这方面的提示都会对我有很大帮助!

    最佳答案

    代码似乎没有任何明显错误,但过滤器的大小为 (25,25)可能有些不太好。

    有两种可能性:

    • 训练指标很好,但测试指标很糟糕:您的模型过度拟合(可能是由于数据太少)
    • 训练指标不好:您的模型不够好

    子问题:

    1 - 是的,您使用的过滤器的窗口大小为 (25,25),可沿输入图像滑动。过滤器越大,它们的通用性就越差。

    2 - 数字 32 指的是该层需要多少个输出“ channel ”。虽然您的输入图像有 3 个 channel :红色层、绿色层和蓝色层,但这些卷积层将产生 32 个不同的 channel 。每个 channel 的含义取决于我们看不到的隐藏数学。

    • channel 的数量完全独立于任何因素。
    • 唯一的限制是:输入 channel 为 3 个,输出类别为 7 个。

    3 - 一个接一个地有“很多”卷积层是正常的。一些众所周知的模型有超过 10 个卷积层。

    • 为什么需要它?每个卷积层都解释前一层的结果,并产生新的结果。它给模型带来了更多的力量。一个可能太少了。

    4 - 生成器生产形状为 (batch_size,image_side1, image_side2, channels) 的批处理。

    • steps_per_epoch是必要的,因为使用的生成器是无限的(因此 keras 不知道何时停止)
    • 通常,人们使用 steps_per_epoch = total_images//batch_size ,所以一个纪元将使用所有图像。但你可以随心所欲地使用这些数字
    • 通常,一个纪元是对整个数据集的一次迭代。 (但是对于生成器和 steps_per_epoch ,这取决于用户)

    5 - 图像数据生成器除了从文件夹加载数据并为您创建类之外,还是一个数据增强工具。

    • 如果数据太少,您的模型就会过度拟合(训练结果出色,测试结果糟糕)。
    • 机器学习需要大量数据才能正常工作
    • 数据增强是一种在数据不足时创建更多数据的方法
      • 在模特的视野中,移动、翻转、拉长等图像是全新的
      • 例如,模型可以学习猫向右看,但不能学习猫向左看

    关于python - 为什么这个 CNN 脚本无法正确预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156010/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com