跟随TensorFlow教程但模型预测不准确

我正在按照一个关于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等,如果这些值不再增加,你可以自动停止进一步拟合模型。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注