了解什么时候使用和什么时候不使用Softmax作为输出层激活。

问题描述 投票:0回答:1

所以我刚开始接触神经网,就着手做一个基本的二进制标签的图像分类网络。根据我对神经网络的理解,我认为在输出层中设置Softmax激活函数的目的是将输入的信息转化为标签的概率,预测的标签是概率较高的标签。所以我的第一个问题是--。

  • 为什么我的模型能够提高它的准确度,并且能够合理的预测呢? 输出层的softmax激活函数?(这里没加输出图片,但确实如此)
  • 其次,当我在输出层添加Softmax作为激活函数时,我观察到了这种奇怪的行为。我的验证精度在所有的时间段都卡在了0.5上,(训练精度卡在了0.813)。训练精度卡在0.813)。

我很确定这是一些明显的问题,但我没有意识到网络架构和我使用的各种超参数。希望得到您的帮助 我把我的代码粘贴在下面给你看看,还没有放出来,但如果你也需要的话,请告诉我。

#Train Data
INPUT_FOLDER = '../input/chest-xray-pneumonia/chest_xray/train/NORMAL'
images = os.listdir(INPUT_FOLDER)
X_train_1 = []
for instance in images:
    image = Image.open('../input/chest-xray-pneumonia/chest_xray/train/NORMAL/' + instance)
    image_rz = image.resize((100,100)).convert('L')
    array = np.array(image_rz)
    X_train_1.append(array)
X_train_1 = np.array(X_train_1)
print(X_train_1.shape)

INPUT_FOLDER = '../input/chest-xray-pneumonia/chest_xray/train/PNEUMONIA'
images = os.listdir(INPUT_FOLDER)
X_train_2 = []
for instance in images:
    image = Image.open('../input/chest-xray-pneumonia/chest_xray/train/PNEUMONIA/' + instance)
    image_rz = image.resize((100,100)).convert('L')
    array = np.array(image_rz)
    X_train_2.append(array)
X_train_2 = np.array(X_train_2)
print(X_train_2.shape)
X_trn = np.concatenate((X_train_1, X_train_2))
print(X_trn.shape)

#Make Labels
y_trn = np.zeros(5216, dtype = str)
y_trn[:1341] = 'NORMAL'
y_trn[1341:] = 'PNEUMONIA'
y_trn = y_trn.reshape(5216,1)

#Shuffle Labels 
X_trn, y_trn = shuffle(X_trn, y_trn)

#Onehot encode categorical labels
onehot_encoder = OneHotEncoder(sparse=False)
y_trn = onehot_encoder.fit_transform(y_trn)

#Model
model = keras.Sequential([
    keras.layers.Flatten(input_shape = (100,100)),
    keras.layers.Dense(256, activation = 'selu'),
    keras.layers.Dense(2, activation = 'softmax')
])

adm = optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)

model.compile(optimizer = adm,
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

for layer in model.layers:
    print(layer, layer.trainable)

model.fit(X_trn, y_trn, validation_data = (X_val, y_val), epochs=30, shuffle = True)



python tensorflow machine-learning keras neural-network
1个回答
2
投票

秘密在于你的损失函数。当你设置 from_logits=True 在您的损失函数中。

loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True) 

它期望值来自一个没有 softmax 激活的层,所以它自己执行 softmax 操作。如果您已经在您的最终层中有一个 softmax 函数,您就不应该设置 from_logitsTrue,将其设置为 False.

你的模型在没有softmax功能的情况下效果很好,而在有softmax功能的情况下效果不好,就是这个原因。

© www.soinside.com 2019 - 2024. All rights reserved.