Tensorflow Keras CNN模型中的训练和损失不变
我正在运行一个CNN的左右鞋印分类。我有190000张训练图像,其中10%用于验证。我的模型设置如下所示。我得到所有图像的路径,读入它们并调整它们的大小。我规范化了图像,然后将其适配到模型中。我的问题是,我的训练准确率一直停留在62.5%左右,损失大约0.6615-0.6619。我做错什么了吗?我怎样才能阻止这种事情发生 请注意以下几点:Tensorflow Keras CNN模型中的训练和损失不变,tensorflow,deep-learning,keras,conv-neural-network,Tensorflow,Deep Learning,Keras,Conv Neural Network,我正在运行一个CNN的左右鞋印分类。我有190000张训练图像,其中10%用于验证。我的模型设置如下所示。我得到所有图像的路径,读入它们并调整它们的大小。我规范化了图像,然后将其适配到模型中。我的问题是,我的训练准确率一直停留在62.5%左右,损失大约0.6615-0.6619。我做错什么了吗?我怎样才能阻止这种事情发生 请注意以下几点: 我首先在10张图片上测试了这一点,我遇到了同样的问题,但将优化器更改为adam,将批处理大小更改为4起作用 然后,我对越来越多的图像进行了测试,但每次我都需
imageWidth=50
图像高度=150
def get_文件路径(目录):
文件路径=[]
对于文件中的文件名:
filepath=os.path.join(根目录,文件名)
文件路径。追加(文件路径)#将其添加到列表中。
返回文件路径
def清除路径(完整文件路径):
cleanPaths=[]
对于fullfilepath中的f:
如果f.endswith(“.png”):
cleanPaths.append(f)
返回路径
def getTrainData(路径):
列车数据=[]
对于X范围内的i(1190000,2):
im=image.imread(路径[i])
im=image.imresize(im,(150,50))
im=(im-255)/浮动(255)
列车数据附加(im)
列车数据=np.asarray(列车数据)
右=np.零(47500)
左=np.一(47500)
列车标签=np.连接((左、右))
trainLabels=np_utils.to_Category(列车标签)
返回(列车数据、列车标签)
#创建convnet
模型=顺序()
model.add(Conv2D(32,(3,3),activation='relu',input_uShape=(imageWidth,imageHeight,1),Strates=1))\32
添加(Conv2D(32,(3,3),activation='relu'))
add(MaxPooling2D(池大小=(2,2)))
模型。添加(辍学率(0.25))
添加(Conv2D(64,(3,3),activation='relu',strips=1))
添加(Conv2D(64,(3,3),activation='relu'))
add(MaxPooling2D(池大小=(2,2)))
模型。添加(辍学率(0.25))
添加(Conv2D(64,(3,3),activation='relu'))
add(MaxPooling2D(池大小=(1,3)))
模型。添加(辍学率(0.25))
model.add(Conv2D(64,(1,2),activation='relu'))
add(MaxPooling2D(池大小=(2,1)))
模型。添加(辍学率(0.25))
model.add(展平())
model.add(密集(256,activation='relu'))
模型。添加(辍学率(0.5))
model.add(密集(2,activation='softmax'))
新加坡元=新加坡元(lr=0.01)
compile(loss='classifical_crossentropy',optimizer='rmsprop',metrics=['accurity'])
#准备培训数据*/
列车路径=获取文件路径(“更好1/列车”)
列车路径=清洁道路(列车路径)
(列车数据,列车标签)=获取列车数据(列车路径)
trainData=np.重塑(trainData,(95000,imageWidth,imageHeight,1)).aType('float32'))
列车数据=(列车数据-255)/浮动(255)
#训练convnet***
模型拟合(列车数据、列车标签、批次尺寸=500、历元=50、验证分割=0.2)
#/保存模型和权重*/
model.save('myConvnet_model5.h5');
模型。保存权重(“myConvnet\u权重5.h5”);
我会尝试几种方法。较低的学习率应有助于获得更多的数据。通常,调整优化器会有所帮助。此外,您的网络看起来非常小,您可能希望通过添加层或增加层中过滤器的数量来增加模型的容量
关于如何在实践中应用深度学习,本文给出了一个更好的描述。我已经多次遇到过这个问题,因此我想对它做一个简要的回顾,以及可能的解决方案等,以帮助未来的人们 问题:模型预测它所看到的所有数据的2个(或更多)可能类别中的一个* 正在发生确认问题:方法1:训练时模型的准确度保持在0.5左右(或1/n,其中n为班级数量)。方法2:获取预测中每个类的计数,并确认它预测了所有一个类 修复/检查(以某种顺序):
- 仔细检查模型架构:使用
,检查模型Model.summary()
- 检查数据标签:确保列车数据的标签在预处理等过程中没有混淆(这种情况经常发生!)
- 检查列车数据馈送是否随机:确保您没有一次将列车数据馈送到模型一类。例如,如果使用
,请检查paramImageDataGenerator().flow\u from\u directory(PATH)
,并且shuffle=True
大于1batch\u size
- 检查预训练层是否不可训练:**如果使用预训练模型,请确保使用预训练权重的任何层最初都不可训练。对于第一个时代,只有新添加的(随机初始化的)层才可以训练<代码>用于预训练_模型中的层。层:layer.trainable=False应该在代码中的某个位置
- 降低学习率:继续将学习率降低10倍,然后重试。注意:每次尝试新的学习速率时,您必须完全重新初始化您尝试训练的层。(例如,我有一个问题,只有当我深入到
时才得到解决,所以请继续!)lr=1e-6