machine-learning - 模型训练后的 Keras 预测

标签 machine-learning keras neural-network conv-neural-network prediction

我已经训练了一个 Keras 模型,并将模型和权重保存到两个单独的文件中。我的训练数据和验证数据分为两类,如下所示:

training_data/
    positive/
    negative
validation_data/
    positive/
    negative/

两个训练数据目录各包含 900k 样本,验证数据目录各包含 20k 样本。所有样本均为 43x43px。

我的模型和学习过程定义如下:

def get_model(img_width, img_height):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=(img_width, img_height, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))

    return model

model = get_model(43, 43)
model.compile(loss='binary_crossentropy', optimizer='rmsprop',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

model.save(os.path.join('model.h5'))
model.save_weights(os.path.join('weights.h5'))
save_model_info(params)

20 个 epoch、批量大小为 1024、1.800.000 个训练样本和 40.000 个验证样本的训练过程大约花费了 5 个小时。 history 对象位于此处,因为我还保存了准确性和学习图。

现在,我试图让这个模型预测给定测试样本中存在经过训练的两个类别中的哪一个。因此,我创建模型,加载权重并尝试运行预测。

model = get_model(43, 43)
model.load_weights(args.weights_file)
model.compile(loss='binary_crossentropy', optimizer='rmsprop',
              metrics=['accuracy'])

result = []
files = os.listdir(input_dir)
for file in files:
    image = load_img(file)
    image = np.asarray(image)
    image = np.expand_dims(image, axis=0)
    result.append(model.predict(image))

print(result)

它正在工作,但不是我想要的方式。输出如下:

[array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32), array([[ 0.]], dtype=float32)]

这是我的问题。我需要它对每个给定文件进行预测,例如

{'negative': 0.925, 'positive': 0.0725}

格式与此处无关。我的观点是,如何获得每个已训练类别的概率?我想我尝试使用所有的模型预测方法,但它们都没有给我我需要的东西。我在代码中做错了什么还是需要以某种不同的方式完成?

最佳答案

我设法解决了这个问题并且它正在工作。问题是我在训练模型时在 ImageGenerator 中添加了 rescale 参数:

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2)

并且我在运行预测时没有添加此内容:

for file in files:
    image = load_img(file)
    image = np.asarray(image)
    image = np.expand_dims(image, axis=0)
    result.append(model.predict(image))

我改变了这一行

image = np.expand_dims(image, axis=0)

现在看起来像这样

img = np.expand_dims(img / 255, axis=0)

我还更新了加载模型,更改了这些行(但只是为了预测,而不是训练):

model = get_model(43, 43)
model.load_weights(args.weights_file)
model.compile(loss='binary_crossentropy', optimizer='rmsprop',
          metrics=['accuracy'])

进入此:

model = load_model(args.model_file)

我用所有样本运行预测,并用结果填充一个 numpy 数组,然后将该数组更改为图像,它就可以工作了。感谢大家的帮助,再次对代码量表示歉意。

关于machine-learning - 模型训练后的 Keras 预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47084316/

相关文章:

r - 如何解释该分类 TreeMap 中的预测?

machine-learning - 从一组文档中对标记句子进行分类的最佳方法

tensorflow - TensorFlow 2 和 Keras 中不同的正向和反向传播

python - 模块 'tensorflow' 没有属性 'get_default_graph' - 我不需要任何图表

tensorflow - 手部地标坐标神经网络不收敛

machine-learning - 华纳(AVE 套件): eliminate "connected" terms from frequent patterns

岭回归模型 : glmnet

machine-learning - 无法将数据适合 3d 卷积 U-net Keras

python - 将输入层与另一个序列模型一起传递到自定义损失函数中

neural-network - Tensorflow:具有交叉熵的缩放 logits