Tri*_*tom 8 deep-learning conv-neural-network keras tensorflow
我正在运行CNN进行左右skeprint classfication.我有190,000张训练图像,我用10%的图像进行验证.我的模型设置如下所示.我得到了所有图像的路径,读取它们并调整它们的大小.我规范化图像,然后将其适合模型.我的问题是我的训练准确率达到了62.5%,并且损失了大约0.6615-0.6619.我有什么不对劲吗?我怎么能阻止这种情况发生?
只需注意一些有趣的要点:
1)我首先在10张图片上对此进行了测试我遇到了同样的问题,但将优化器更改为adam,将批量大小更改为4.
2)然后我测试了越来越多的图像,但每次我都需要更改批量大小以获得准确性和损失的改进.有10,000个图像,我不得不使用批量大小500和优化程序rmsprop.然而,准确性和损失在第10纪元后才开始发生变化.
3)我现在正在训练190,000张图像,因为我的GPU处于最大值,所以无法增加批量大小.
imageWidth = 50
imageHeight = 150
def get_filepaths(directory):
file_paths = []
for filename in files:
filepath = os.path.join(root, filename)
file_paths.append(filepath) # Add it to the list.
return file_paths
def cleanUpPaths(fullFilePaths):
cleanPaths = []
for f in fullFilePaths:
if f.endswith(".png"):
cleanPaths.append(f)
return cleanPaths
def getTrainData(paths):
trainData = []
for i in xrange(1,190000,2):
im = image.imread(paths[i])
im = image.imresize(im, (150,50))
im = (im-255)/float(255)
trainData.append(im)
trainData = np.asarray(trainData)
right = np.zeros(47500)
left = np.ones(47500)
trainLabels = np.concatenate((left, right))
trainLabels = np_utils.to_categorical(trainLabels)
return (trainData, trainLabels)
#create the convnet
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(imageWidth,imageHeight,1),strides=1))#32
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu',strides=1))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(1, 3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (1, 2), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 1)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
sgd = SGD(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=['accuracy'])
#prepare the training data*/
trainPaths = get_filepaths("better1/train")
trainPaths = cleanUpPaths(trainPaths)
(trainData, trainLabels) = getTrainData(trainPaths)
trainData = np.reshape(trainData,(95000,imageWidth,imageHeight,1)).astype('float32')
trainData = (trainData-255)/float(255)
#train the convnet***
model.fit(trainData, trainLabels, batch_size=500, epochs=50, validation_split=0.2)
#/save the model and weights*/
model.save('myConvnet_model5.h5');
model.save_weights('myConvnet_weights5.h5');
Run Code Online (Sandbox Code Playgroud)
DBC*_*igo 16
我现在已经多次讨论过这个问题了,所以想想对它进行一些回顾以及可能的解决方案等,以便将来帮助人们.
问题:模型预测它看到的所有数据的2个(或更多)可能类别之一*
确认问题正在发生:方法1:模型的准确性在训练时保持在0.5左右(或1/n,其中n是类的数量).方法2:获取预测中每个类的计数并确认它预测所有一个类.
修复/检查(在某种程度上):
model.summary()
,检查模型.ImageDataGenerator().flow_from_directory(PATH)
,检查PARAM shuffle=True
和batch_size
大于1.for layer in pretrained_model.layers: layer.trainable = False
应该在你的代码中的某个地方.lr=1e-6
,所以继续!)如果你们中的任何人知道更多的修复/检查可以正确地进行模型培训,那么请做出贡献,我会尝试更新列表.
**注意,一旦新层最初训练"足够",通常可以使更多的预训练模型可训练
*帮助搜索的问题的其他名称来到这里... keras tensorflow theano CNN卷积神经网络坏训练卡住固定不静态破碎bug bugged堵塞训练优化优化只有0.5准确度不改变只预测一个单一类不会训练模型卡住类模型在epochs keras CNN相同输出之间重置自身
归档时间: |
|
查看次数: |
8562 次 |
最近记录: |