我对Python和机器学习都很陌生,我正在开发我的第一个真正的图像识别项目。它基于this tutorial,它只有两个分类(猫或狗),并且有更多的数据。尽管如此,我没有让我的多类脚本正确地预测它,但主要是如何解决脚本问题。该脚本无法正确预测。
以下是脚本。数据/图像由7个文件夹组成,每个文件夹大约10-15个图像。图像是100x100px的不同多米诺骨牌,一个文件夹只是婴儿照片(主要是作为对照组,因为它们与多米诺骨牌照片非常不同):
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"
说明:
dataset/prediction_images/
包含脚本预测的大约10个不同的图像result
通常会输出array([[0., 0., 1., 0., 0., 0., 0.]], dtype=float32)
我的问题
我的主要问题是:你看到脚本有什么特别的错误吗?或者,如果脚本工作正常并且只是缺少使预测错误的数据?
子问题:
整个部分包含:
classifier.fit_generator(training_set,
steps_per_epoch = 168,
epochs = 35,
validation_data = test_set,
validation_steps = 3)
让我感到困惑。据我所知,steps_per_epoch
应该是我拥有的训练图像的数量。那是对的吗? epochs
CNN的迭代次数是多少?
我不明白为什么需要此代码:
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)
在我看来,它正在创建图像的副本/版本,放大它们,翻转它们等等。为什么需要它?
任何关于此的提示都会对我有所帮助!
答案 0 :(得分:2)
代码似乎没有任何明显的错误,但是大小为(25,25)
的过滤器可能有些不好。
有两种可能性:
<强>子问题:强>
1 - 是的,您正在使用沿着输入图像滑动的窗口大小(25,25)的过滤器。过滤器越大,它们就越不普遍。
2 - 数字32指的是多少输出&#34;频道&#34;你想要这个图层。当您的输入图像有3个通道,红色层,绿色层和蓝色层时,这些卷积层将产生32个不同的通道。每个频道的含义取决于我们无法看到的隐藏数学。
3 - 很多&#34;很多&#34;卷积层,一个在另一个上。一些众所周知的模型具有超过10个卷积层。
4 - 生成器生成形状为(batch_size,image_side1, image_side2, channels)
的批次。
steps_per_epoch
是必要的,因为使用的生成器是无限的(因此keras不知道何时停止)steps_per_epoch = total_images//batch_size
,因此一个纪元将使用所有图像。但是你可以随心所欲地使用这些数字steps_per_epoch
,这取决于用户)5 - 图像数据生成器除了从您的文件夹加载数据并为您创建课程外,还是数据扩充的工具。