所以我刚开始接触神经网,就着手做一个基本的二进制标签的图像分类网络。根据我对神经网络的理解,我认为在输出层中设置Softmax激活函数的目的是将输入的信息转化为标签的概率,预测的标签是概率较高的标签。所以我的第一个问题是--。
我很确定这是一些明显的问题,但我没有意识到网络架构和我使用的各种超参数。希望得到您的帮助 我把我的代码粘贴在下面给你看看,还没有放出来,但如果你也需要的话,请告诉我。
#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)
秘密在于你的损失函数。当你设置 from_logits=True
在您的损失函数中。
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True)
它期望值来自一个没有 softmax 激活的层,所以它自己执行 softmax 操作。如果您已经在您的最终层中有一个 softmax 函数,您就不应该设置 from_logits
到 True
,将其设置为 False
.
你的模型在没有softmax功能的情况下效果很好,而在有softmax功能的情况下效果不好,就是这个原因。