python - 如何使用 Keras 预测单个样本
问题描述
我正在尝试实现一个全卷积神经网络,并且可以在训练后成功地测试模型在测试集上的准确性。但是,我想使用该模型仅对单个样本进行预测。培训是分批进行的。我相信我所缺少的与批量大小和输入形状有关。这是网络的配置:
def read(file_name):
data = np.loadtxt(file_name, delimiter="\t")
y = data[:, 0]
x = data[:, 1:]
return x, y.astype(int)
train_data, train_labels = read("FordA_TRAIN.tsv")
test_data, test_labels = read("FordA_TEST.tsv")
train_data = train_data.reshape((train_data.shape[0], train_data.shape[1], 1))
test_data = test_data.reshape((test_data.shape[0], test_data.shape[1], 1))
num_classes = len(np.unique(train_labels))
#print(train_data[0])
# Shuffle the data to prepare for validation_split (and prevent overfitting for class order)
idx = np.random.permutation(len(train_data))
train_data = train_data[idx]
train_labels = train_labels[idx]
#Standardize labels to have a value between 0 and 1 rather than -1 and 1.
train_labels[train_labels == -1] = 0
test_labels[test_labels == -1] = 0
def make_model(input_shape):
input_layer = keras.layers.Input(input_shape)
conv1 = keras.layers.Conv1D(filters=64, kernel_size=3, padding="same")(input_layer)
conv1 = keras.layers.BatchNormalization()(conv1)
conv1 = keras.layers.ReLU()(conv1)
conv2 = keras.layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv1)
conv2 = keras.layers.BatchNormalization()(conv2)
conv2 = keras.layers.ReLU()(conv2)
conv3 = keras.layers.Conv1D(filters=64, kernel_size=3, padding="same")(conv2)
conv3 = keras.layers.BatchNormalization()(conv3)
conv3 = keras.layers.ReLU()(conv3)
gap = keras.layers.GlobalAveragePooling1D()(conv3)
output_layer = keras.layers.Dense(num_classes, activation="softmax")(gap)
return keras.models.Model(inputs=input_layer, outputs=output_layer)
model = make_model(input_shape=train_data.shape[1:])
keras.utils.plot_model(model, show_shapes=True)
epochs = 500
batch_size = 32
callbacks = [
keras.callbacks.ModelCheckpoint(
"best_model.h5", save_best_only=True, monitor="val_loss"
),
keras.callbacks.ReduceLROnPlateau(
monitor="val_loss", factor=0.5, patience=20, min_lr=0.0001
),
keras.callbacks.EarlyStopping(monitor="val_loss", mode = 'min', patience=50, verbose=1),
]
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["sparse_categorical_accuracy"],
)
history = model.fit(
train_data,
train_labels,
batch_size=batch_size,
epochs=epochs,
callbacks=callbacks,
validation_split=0.2,
verbose=1,
)
model = keras.models.load_model("best_model.h5")
test_loss, test_acc = model.evaluate(test_data, test_labels)
print("Test accuracy", test_acc)
print("Test loss", test_loss)
上面的代码可以成功的显示出准确率收敛的地方。现在,我想对单个样本进行预测。到目前为止,我有:
def read(file_name):
data = np.loadtxt(file_name, delimiter="\t")
y = data[:, 0]
x = data[:, 1:]
return x, y.astype(int)
test_data, test_labels = read("FordA_TEST_B.tsv")
test_data = test_data.reshape((test_data.shape[0], test_data.shape[1], 1))
test_labels[test_labels == -1] = 0
print(test_data)
model = keras.models.load_model("forda_original_model.h5")
q = model.predict(test_data[0])
这会引发错误: ValueError: Error when checks input: expected input_1 to have 3 dimensions, but got array with shape (500, 1)
如何重新塑造输入以及遵循什么规则?任何帮助深表感谢!
解决方案
从评论中复制:
该模型需要一个批次维度。因此,要预测单个模型,只需通过运行扩展维度以创建单个大小的批次:
q = model.predict(test_data[0][None,...])
或者
q = model.predict(test_data[0][np.newaxis,...])
推荐阅读
- python - 从宽到长,但我想使用前缀而不是后缀
- java - 无法使用 Hibernate 保存数据
- adsense - google adsense 中的自动广告
- java - 如何从外部类访问内部静态类方法和成员?
- javascript - featherlight.js - 当前和总量的幻灯片
- python - Sorting vs iterative querying question in Pandas
- java - 顺时针方向查找数组中两个索引之间的距离
- python - Python - 将具有特定 base_name 的列转换为行
- html - 从 HTML 音频标签流式传输不缓冲文件
- windows - 使用 Windows 多媒体计时器时,是否必须在 timeSetEvent 之前调用 timeBeginPeriod?