我正在按照一个关于TensorFlow图像分类的教程进行学习。
我的使用案例与教程略有不同,教程使用的是国际象棋棋子,而我使用的是交通信号灯,并且想要检测它是红色、绿色还是琥珀色。
我发现我的测试结果很差,我想知道这是否与教程中CreateData部分的cv2.IMREAD_GRAYSCALE
有关。当然,颜色在我的分类器中很重要,所以我怀疑教程是否将图像转换成了灰度,因此导致我的结果不准确。
因此,我将所有cv2.IMREAD_GRAYSCALE
的引用改成了cv2.IMREAD_COLOR
,重新运行了CreateData程序,然后尝试运行神经网络创建程序,但随后出现了错误:
File "CreateNeuralNetwork.py", line 54, in <module> history = model.fit(X, y, batch_size=32, epochs=40, validation_split=0.1) File "/Users/stuff/Library/Python/2.7/lib/python/site-packages/tensorflow/python/keras/engine/training.py", line 709, in fit shuffle=shuffle) File "/Users/stuff/Library/Python/2.7/lib/python/site-packages/tensorflow/python/keras/engine/training.py", line 2688, in _standardize_user_data training_utils.check_array_lengths(x, y, sample_weights) File "/Users/stuff/Library/Python/2.7/lib/python/site-packages/tensorflow/python/keras/engine/training_utils.py", line 483, in check_array_lengths 'and ' + str(list(set_y)[0]) + ' target samples.')ValueError: Input arrays should have the same number of samples as target arrays. Found 195 input samples and 65 target samples.
我猜测这改变了我的网络的大小/复杂性,因此网络创建中现在有些地方出了问题,有人能帮我找出问题所在吗(我没有更改过我上面链接的博客文章中的任何部分)。
我打赌这部分需要做一些更改:
# normalizing data (a pixel goes from 0 to 255)X = X/255.0# Building the modelmodel = Sequential()# 3 convolutional layersmodel.add(Conv2D(32, (3, 3), input_shape = X.shape[1:]))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.25))
考虑到灰度图像的像素值范围是0到255,而彩色像素值会大得多,并且更可能是RGB向量。我不知道该怎么做,或者该更改什么。
我可能完全偏离了轨道,欢迎大家的建议。
此外,在使用以下代码训练模型时:
history = model.fit(X, y, batch_size=32, epochs=40, validation_split=0.1)
看起来epochs是指训练模型的次数。将次数从40次增加到400次有什么优势吗?这些其他参数是否重要?我如何知道模型是否已经“过度训练”了?什么是临界点?
回答:
显然,错误显示它将彩色图像的每个通道都视为单独的灰度图像。这就是为什么“发现195个输入样本和65个目标样本”,即多出3倍。因此,你应该查看代码中准备数据的部分。检查第53行
X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)
你应该将其更改为
X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 3)
希望这对你有帮助。
关于你的第二个问题“如何知道模型是否已经‘过度训练’了?什么是临界点?”
绘制准确率和损失图表,这将给你关于偏差和方差的想法。对于epochs参数的设置,Keras回调函数会很有用。通过它,你可以监控任何数量,如train_loss, train_acc等,如果这些值不再增加,你可以自动停止进一步拟合模型。