python - 为什么 Keras 训练良好但返回错误的预测?
问题描述
如果我给模型喂五朵 Setosas 花,我无法让我的模型预测它们确实是 Setosas。
这是我的代码设置:
# Load libraries
import numpy as np
import pandas as pd
from keras import models
from keras import layers
from keras.models import Sequential
from keras.layers import Dense
from sklearn.utils import shuffle
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
# Set random seed
np.random.seed(0)
# Step 1: Load data
iris = pd.read_csv("iris.csv")
X = iris.drop('species', axis=1)
y = pd.get_dummies(iris['species']).values
# Step 2: Preprocess data
scaler = preprocessing.StandardScaler()
X = scaler.fit_transform(X)
X, y = shuffle(X, y)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
network = models.Sequential()
network.add(layers.Dense(units=8, activation="relu", input_shape=(4,)))
network.add(layers.Dense(units=3, activation="softmax"))
# Compile neural network
network.compile(loss="categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"])
# Train neural network
history = network.fit(X_train, # Features
y_train, # Target
epochs= 200,
verbose= 1,
batch_size=10, # Number of observations per batch
validation_data=(X_test, y_test)) # Test data
模型训练得很好,这是最后一个 epoch:
Epoch 200/200
112/112 [==============================] - 0s 910us/step - loss: 0.0740 - acc: 0.9911 - val_loss: 0.1172 - val_acc: 0.9737
现在,让我们进行一些预测。
new_iris = iris.iloc[0:5, 0:4] # pull out the first five Setosas from original iris dataset;
# prediction should give me Setosa since I am feeding it Setosas
np.around(network.predict(new_iris), decimals = 2) # predicts versicolor with high probability
array([[0. , 0.95, 0.04],
[0. , 0.94, 0.06],
[0. , 0.96, 0.04],
[0. , 0.91, 0.09],
[0. , 0.96, 0.04]], dtype=float32)\
关于为什么会这样的任何想法?
解决方案
您需要在测试时应用在训练期间学到的转换。
new_iris = iris.iloc[0:5, 0:4] # pull out the first five Setosas from original iris dataset;
new_iris = scaler.transform(new_iris)
np.around(network.predict(new_iris), decimals = 2)
输出
array([[1. , 0. , 0. ],
[0.99, 0.01, 0. ],
[1. , 0. , 0. ],
[0.99, 0.01, 0. ],
[1. , 0. , 0. ]], dtype=float32)
推荐阅读
- free-monad - 自由单子只是带有接口的单子吗?
- android - 在 Room 中,如何在 POJO 中指定父实体关系?
- javascript - 增加高度图分辨率以在 THREE.js 中可视化为表面
- java - 如何在 JavaFX 中包装文本
- sql - 如何将单独列中冒号前后的单词拆分为sql中的行
- amazon-web-services - AWS 是先发制人的(用于 HTTP 结果回调)吗?
- c# - Xamarin:尝试使用带有 html 和 javascript 的 OpenLayers 地图显示 WebView 时出错
- c - 在不取消引用的情况下使用带有指针的索引
- python - 如何编写字符串算法
- tensorflow - 将模型转换为 Coral Dev Board 的 tf lite