我训练了一个模型来将图片分为两种不同的类型。一切都运行得很好,但我的模型只能做一个特定的预测(在我的例子中是1或0),但我感兴趣的是一个更像概率的预测(例如90%1和10%0)。我的代码中现在应该修改的部分在哪里?是不是sigmoid函数最终决定了它是1还是0?帮帮忙就好了。提前谢谢。
import numpy as np
from keras.callbacks import TensorBoard
from keras import regularizers
from keras.models import Sequential
from keras.layers import Activation, Dropout, Flatten, Dense, Conv2D, MaxPooling2D
from keras.optimizers import Adam
from keras.metrics import categorical_crossentropy
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.layers.normalization import BatchNormalization
from utils import DataGenerator, PATH
train_path = 'Dataset/train'
valid_path = 'Dataset/valid'
test_path = 'Dataset/test'
model = Sequential()
model.add(Conv2D(16, (3, 3), input_shape=(640, 640, 1), padding='same', activation='relu',
kernel_regularizer=regularizers.l2(1e-4),
bias_regularizer=regularizers.l2(1e-4)))
model.add(MaxPooling2D(pool_size=(4, 4)))
model.add(Conv2D(32, (3, 3), activation='relu',
kernel_regularizer=regularizers.l2(1e-4),
bias_regularizer=regularizers.l2(1e-4)))
model.add(MaxPooling2D(pool_size=(5, 5)))
model.add(Conv2D(64, (3, 3), activation='relu',
kernel_regularizer=regularizers.l2(1e-4),
bias_regularizer=regularizers.l2(1e-4)))
model.add(MaxPooling2D(pool_size=(6, 6)))
model.add(Flatten())
model.add(Dense(64, activation='relu',
kernel_regularizer=regularizers.l2(1e-4),
bias_regularizer=regularizers.l2(1e-4)))
model.add(Dropout(0.3))
model.add(Dense(1, activation='sigmoid',
kernel_regularizer=regularizers.l2(1e-4),
bias_regularizer=regularizers.l2(1e-4)))
print(model.summary())
model.compile(loss='binary_crossentropy', optimizer=Adam(lr=1e-3), metrics=['accuracy'])
epochs = 50
batch_size = 16
datagen = DataGenerator()
datagen.load_data()
model.fit_generator(datagen.flow(batch_size=batch_size), epochs=epochs, validation_data=datagen.get_validation_data(),
callbacks=[TensorBoard(log_dir=PATH+'/tensorboard')])
#model.save_weights('first_try.h5')
model.save('second_try')
如果我尝试在我的模型中获得一张图片,如下所示:
path = 'train/clean/picturenumber2'
def prepare(filepath):
IMG_SIZE = 640
img_array = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1)
model = tf.keras.models.load_model('second_try')
prediction = model.predict(prepare(path))
print(prediction)
如果我放入一个包含多张图片的列表,我也会得到这样的输出:[[1.]]
。这个预测本身似乎起作用了。
发布于 2020-11-07 18:13:36
简答:将最后一层中的sigmoid激活函数更改为softmax
为什么?
因为sigmoid输出范围是0.0到1.0,所以要对此输出进行有意义的解释,您需要选择一个适当的阈值,高于该阈值表示正类,低于该阈值的任何值都表示为负类。(对于二进制分类问题)
即使softmax也有相同的输出范围,但不同的是它的输出是 here上更多的归一化类概率,所以如果你的模型在任何给定的输入上输出0.99,那么它可以被解释为该模型99.0%的置信度为正类,0.1%的置信度为负类。
更新:正如@amin建议的那样,如果你需要归一化概率,你应该做更多的更改才能正常工作。
https://stackoverflow.com/questions/64730471
复制相似问题