Pec*_*ans 2 python machine-learning python-3.x keras tensorflow
我正在使用keras创建一个卷积神经网络,试图将图像分为两个不同的类,并且由于某种原因,在第一个时代之后,准确性永远不会改变.
使用Keras之后to_categorical()
我的标签看起来像:
[[0. 1.]
[1. 0.]
[1. 0.]
[0. 1.]]
Run Code Online (Sandbox Code Playgroud)
我的模型的代码是:
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=[5, 5], strides=1, padding='same', activation='relu', input_shape=(imageSize, imageSize, 3)))
model.add(MaxPooling2D())
model.add(Conv2D(filters=64, kernel_size=[5, 5], strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(2))
sgd = SGD() # Use stochastic gradient descent for now
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
model.summary()
counter = 0
# Train one cycle at a time so we can shuffle data inbetween
for x in range(trainingEpochs):
counter += 1
print() # New line
print('Epoch ' + str(counter))
trainingImages, trainingLabels = shuffle(trainingImages, trainingLabels, random_state=0) # Shuffle both sets in unison
model.fit(x=trainingImages, y=trainingLabels, batch_size=32, epochs=1, verbose=2)
Run Code Online (Sandbox Code Playgroud)
此代码导致输出:
Epoch 1
36s - loss: 5.0770 - acc: 0.3554
Epoch 2
36s - loss: 4.9421 - acc: 0.3066
Epoch 3
36s - loss: 4.9421 - acc: 0.3066
Epoch 4
36s - loss: 4.9421 - acc: 0.3066
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试使用binary_crossentropy更改批量大小,更改混洗方法,更改卷积参数,使用黑白照片而不是RGB,使用不同大小的图片,使用ADAM代替SGD,以及使用较低的学习率对于新元,但没有一个解决了这个问题.我很茫然,有没有人有任何想法?
编辑:trainingImages的形状为(287,256,256,3),如果重要的话.
小智 8
症状是训练损失相对较早地停止改善.假设您的问题完全可以学习,这种行为有很多原因.这些都是我的头脑:
神经网络优先选择零均值输入.例如,如果输入全部为正,则将限制权重在相同方向上更新,这可能是不可取的(https://youtu.be/gYpoJMlgyXA).
因此,您可能希望从所有图像中减去平均值(例如,从3个通道中的每个通道中减去127.5).缩放以在每个通道中进行单位标准偏差也可能有所帮助.
网络对于任务而言并不复杂或不够深入.
这很容易检查.您可以在几张图片上训练网络(从3到10说).网络应该能够过度拟合数据并将损失驱动到接近0.如果不是这样,您可能需要添加更多层,例如使用多于1个Dense层.
另一个好主意是使用预先训练过的砝码(在Keras文档的应用中).您可以调整顶部的Dense图层以适合您的问题.
不正确的权重初始化可以防止网络收敛(https://youtu.be/gYpoJMlgyXA,与之前相同的视频).
对于ReLU激活,您可能希望使用He初始化而不是默认的Glorot初始化.我发现这有时可能是必要的,但并非总是如此.
最后,您可以使用Keras的调试工具,例如keras-vis,keplr-io,deep-viz-keras.它们对于打开卷积网络的黑盒非常有用.
归档时间: |
|
查看次数: |
3387 次 |
最近记录: |