【问题标题】:Validation accurary doesn't get better验证准确性并没有变得更好
【发布时间】:2020-02-23 02:45:37
【问题描述】:

我正在做一个关于神经网络的项目,并正在尝试使用 keras 和 tensorflow 包的 python 代码。目前,我遇到了一个问题,即根本没有使验证准确度上升。我有一个包含 9815 个图像和 200 个测试集图像的训练集。我真的被困在这里请帮忙。

目前,几乎所有 100 个 epoch 的验证结果都恰好是 0.5000,而且根本没有上升。

#Image Processing Stage
train_data = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)

test_data = ImageDataGenerator(rescale = 1./255)

training_set = train_data.flow_from_directory('dataset/train_data', target_size = (128, 128),  batch_size = 42,  class_mode = 'binary')

test_set = test_data.flow_from_directory('dataset/test_data', target_size = (128, 128), batch_size = 42, class_mode = 'binary')




# Starting Convolutional Neural Network
start_cnn = load_model('CNN.h5')
start_cnn.get_weights()
start_cnn = Sequential()


start_cnn.add(Conv2D(32, (3, 3), input_shape = (128, 128, 3), activation = 'relu', padding='same'))                 #3*3*3*32+32
start_cnn.add(Conv2D(32, (3, 3), activation = 'relu'))
start_cnn.add(MaxPooling2D(pool_size = (2, 2)))

for i in range(0,2):
    start_cnn.add(Conv2D(128, (3, 3), activation = 'relu', padding='same'))

start_cnn.add(MaxPooling2D(pool_size = (2, 2)))

for i in range(0,2):
    start_cnn.add(Conv2D(128, (3, 3), activation = 'relu', padding='same'))

start_cnn.add(MaxPooling2D(pool_size = (2, 2)))

# Flattening
start_cnn.add(Flatten())

# Step 4 - Full connection
start_cnn.add(Dense(activation="relu", units=128))
start_cnn.add(Dense(activation="relu", units=64))
start_cnn.add(Dense(activation="relu", units=32))
start_cnn.add(Dense(activation="softmax", units=1))

start_cnn.summary()


# Compiling the CNN

start_cnn.compile(Adam(learning_rate=0.001), loss = 'binary_crossentropy', metrics = ['accuracy'])

start_cnn.fit(training_set, steps_per_epoch=234, epochs = 100, validation_data = test_set)  


start_cnn.save('CNN.h5')

【问题讨论】:

标签: python tensorflow keras conv-neural-network


【解决方案1】:

你不能对一个神经元使用softmax 激活,就像你在这里做的那样:

start_cnn.add(Dense(activation="softmax", units=1))

要对一个神经元进行二元分类,您必须使用sigmoid 激活:

start_cnn.add(Dense(activation="sigmoid", units=1))

【讨论】:

  • 谢谢,我会尝试改变它。只是为了澄清,我的 CNN 的结果有 2 个输出选择,所以对于我的最后一个密集层,我应该放置 1 还是 2 的单元?
  • @WinRummaneethorn 答案并没有说要改变神经元的数量,只是激活。
  • 对不起,我刚开始做神经网络,你能解释一下为什么 softmax 不能用于 unit 1 吗?
  • @WinRummaneethorn 当然,因为 softmax 是使用所有单位的指数总和进行归一化的,所以对于一个单位,唯一可能的值是常数 1.0 您可能注意到训练或验证损失/准确性会发生变化,这就是原因。
  • 目前,在像你提到的那样更改为 sigmoid 之后,我的 val_loss 从大约 8-10 急剧下降到现在的 1。尽管如此,我的 val_accuracy 仍然精确到 0.5000
猜你喜欢
  • 2018-05-22
  • 2020-10-02
  • 2019-11-18
  • 2021-07-31
  • 1970-01-01
  • 2021-11-12
  • 2019-01-30
  • 2014-05-12
  • 2020-07-08
相关资源
最近更新 更多