Kev*_*vin 5 python machine-learning deep-learning conv-neural-network keras
我有2种灰度图像,比如汽车和飞机。在我的训练集中,我有1000张图像(大约50/50的比例)。在此训练集中,我所有的飞机示例均在白色背景上,而所有汽车示例均在黑色背景上(这是有目的的,模型最终学会了区分汽车和飞机,而不是背景) 。
为了简单证明模型将很快适应背景,我创建了一个CNN。但是,我遇到了两种奇怪的情况:
如果在转换层和另一层之间的任何位置添加BatchNorm,我的训练精度似乎会徘徊在50%左右,并且无法提高。
如果我删除BatchNorm,我的训练准确性将迅速飙升至98%。尽管我使用我的训练数据集来创建一个验证数据集(因此,该验证数据集还具有黑白背景问题),但我的验证数据集却徘徊在50%左右。我希望我的训练数据集过拟合是由黑白背景引起的,而我的验证数据集也有并且可以对此进行预测。
我已经附上了我的代码。我将数据作为1x4096向量获得,因此将其重塑为64x64图像。当我在下面的代码中取消注释任何BatchNorm步骤时,训练准确性似乎都在徘徊
#Normalize training data
self.x = self.x.astype('float32')
self.x /= 255
numSamples = self.x.shape[0]
#Reconstruct images
width = 64
height = 64
xInput = self.x.reshape(numSamples,1,height,width)
y_test = to_categorical(labels, 2)
#Split data to get validation set
X_train, X_test, y_train, y_test = train_test_split(xInput, y_test, test_size=0.3, random_state=0)
#Construct model
self.model = Sequential()
self.model.add(Conv2D(64, kernel_size=(3, 3), strides=(1, 1),
activation='relu',
input_shape=(1,64,64), data_format='channels_first',activity_regularizer=regularizers.l1(0.01)))
#self.model.add(BatchNormalization())
self.model.add(MaxPooling2D((2, 2)))
self.model.add(Dropout(0.5, noise_shape=None))
self.model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), activation='relu'))
#self.model.add(BatchNormalization())
self.model.add(MaxPooling2D((2, 2)))
self.model.add(Dropout(0.5, noise_shape=None))
self.model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), activation='relu'))
#self.model.add(BatchNormalization())
self.model.add(MaxPooling2D((2, 2)))
self.model.add(Dropout(0.5, noise_shape=None))
self.model.add(Flatten())
self.model.add(Dense(1000, activation='relu', activity_regularizer=regularizers.l2(0.01)))
self.model.add(BatchNormalization())
self.model.add(Dropout(0.5, noise_shape=None))
self.model.add(Dense(units = 2, activation = 'softmax', kernel_initializer='lecun_normal'))
self.model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
self.model.fit(X_train, y_train,
batch_size=32,
epochs=25,
verbose=2,
validation_data = (X_test,y_test),
callbacks = [EarlyStopping(monitor = 'val_acc', patience =5)])
Run Code Online (Sandbox Code Playgroud)
我认为您的人工神经网络的架构有许多潜在的改进和一些基本问题。
基本的挑战在于训练集的构建方式:黑白背景。如果目的是背景不应该发挥作用,为什么不将它们全部设为白色或黑色呢?请注意,人工神经网络与任何机器学习算法一样,都会尝试找出您的类别的不同之处。在这种情况下,它只是背景。当背景提供如此清晰且有益的差异时,为什么要关注汽车与飞机的微小细节呢?
解决方案:使两组背景统一。那么你的人工神经网络就会忽视它。
为什么 Batch Norm 会扰乱训练准确性?正如您自己所指出的,测试准确性仍然很差。批归一化正在解决协方差漂移问题。这个“问题”后来在看似很高的训练准确性和糟糕的测试中显现出来。关于批量归一化的精彩视频,其中包含有关协方差偏移的内容,来自 Andrew Ng (此处)。
解决培训应该可以解决问题。其他一些事情:
categorical_crossentropy为binary_crossentropy.| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |