Python 如何使用经过训练和保存的前馈神经网络对新数据进行预测
我正在尝试使用经过训练和保存的模型对新数据进行预测。我的新数据与用于构建保存模型的数据的形状不同 我尝试过使用model.save()和model.save_weights(),因为我仍然希望保留训练配置,但它们都会产生相同的错误 是否有一种方法可以在新数据上使用保存的模型,即使形状不同Python 如何使用经过训练和保存的前馈神经网络对新数据进行预测,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,我正在尝试使用经过训练和保存的模型对新数据进行预测。我的新数据与用于构建保存模型的数据的形状不同 我尝试过使用model.save()和model.save_weights(),因为我仍然希望保留训练配置,但它们都会产生相同的错误 是否有一种方法可以在新数据上使用保存的模型,即使形状不同 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Activation, Dense mod
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation, Dense
model = Sequential([
Dense(units=11, activation='relu', input_shape = (42,), kernel_regularizer=keras.regularizers.l2(0.001)),
Dense(units=1, activation='sigmoid')
])
new_model.load_weights('Fin_weights.h5')
y_pred = new_model.predict(X)
不,您必须完全匹配相同的输入形状 模型的代码(
model=Sequential([…
行)应与保存的模型和输入数据完全对应(y\u pred=new\u model.predict(X)
行)中的X
应与保存的模型中的形状相同('Fin\u weights.h5'
)
你能做的唯一一件事就是以某种方式在你的新数据中填入例如零。但只有当其余的值对应于相同的特征或信号时,这才有帮助
例如,假设您正在训练NN以识别形状(2,3)的灰色图像,如下所示:
1 2 3
4 5 6
然后你训练了模型并保存下来供以后使用。之后你决定在更小或更大的图像上使用你的神经网络,就像这样
1 2
3 4
还是这个
1 2 3 4
5 6 7 8
9 10 11 12
而且你几乎可以肯定你的神经网络在不同形状的输入上仍然会给出很好的结果
然后,只需在右侧用额外的零填充第一个不匹配的图像,如下所示:
1 2 0
3 4 0
或者另一种填充方式,在左侧
0 1 2
0 3 4
第二张图片你剪了一点
1 2 3
5 6 7
(或从其他侧面切割)
只有这样,您才能将NN应用于此已处理的输入图像
同样的情况下,你必须加两个零。但只有在编码输入信号或特征序列几乎相同的情况下
如果用于预测的数据大小错误,请执行以下操作:
y_pred = new_model.predict(
np.pad(X, ((0, 0), (0, 2)))
)
这会在右侧用两个零填充数据,尽管您可能希望将其填充在左侧((2,0)
而不是(0,2)
),或者在两侧((1,1)
而不是(0,2)
)
如果保存的权重形状不同,则模型代码在模型代码中执行此操作(更改42-->44
):
您可能应该执行上述两项操作,以匹配保存的模型/权重
如果为输入44
数字而训练的神经网络会对42
数据的任何填充给出完全错误的结果,那么唯一的方法是重新训练神经网络进行42
输入并再次保存模型
但是你必须考虑到这样一个事实,keras库中的input\u shape=(44,)
实际上意味着输入模型的最终数据X
。predict(X)
应该是二维形状,就像(10,44)
(其中10是神经网络要识别的不同对象的数量),keras隐藏第0维,这就是所谓的批处理维。批处理(第0维)实际上可以变化,您可以输入5个对象(即形状数组(5,44)
)或7个对象(形状(7,44))或任何其他数量的对象。批处理仅意味着keras在一次调用中并行处理多个对象,这只是为了快速/高效。但每个对象都是形状(44,)
)的一维子数组。可能您不了解数据如何馈送到网络和表示。44不是数据集的大小(对象数量),它是单个对象的特征数,例如,如果网络识别/分类一个人,则44可以表示一个人的44个特征,如年龄、性别、身高、体重、出生月份、种族、肤色、每日胼胝体数、月收入、月支出、工资等,总共为一个对象的44个不同固定特征。T他们可能不会改变。但是如果你得到了一些其他数据,这些数据只有42
或36
特征,而你只需要将0
精确地放在44
中缺少的特征的位置,那么在右侧或左侧用零填充是不正确的,你必须将0
精确地放在这些位置44
中缺少的位置
但是您的44、42和36可能意味着不同输入对象的数量,每个对象只有1
特征如果50
人类只有两列数据salary
和country
,那么你可能想通过salary
来构建猜测country
的神经网络,然后你就可以input_shape=(1,)
(对应于1个数字的一维数组-salary
),但绝对不能input_shape=(50,)
(表中的人类数量)。input\u shape
只告诉1个对象的形状,1个人。50是对象(人类)的数量,是numpy数组中用于预测的批次(第0个)维度,因此您的X
数组用于模型。predict(X)
是形状(50,1)
,但input\u shape=(1,)
在模型中。基本上,keras忽略(隐藏)第0个批次维度。如果在您的案例中44
实际上意味着数据集大小(对象数量),那么您错误地训练了NN,应该使用input\u shape=(1,)重新训练它
,44
作为一个批处理维度,该44
可能因培训或测试数据集的大小而异
如果您打算重新培训您的人际网络,那么整个培训/评估过程以简单的形式如下:
data.CSV
中有一个数据集。例如,您总共有126行和17列
y_pred = new_model.predict(
np.pad(X, ((0, 0), (0, 2)))
)
model = Sequential([
Dense(units=11, activation='relu', input_shape = (44,), kernel_regularizer=keras.regularizers.l2(0.001)),
Dense(units=1, activation='sigmoid')
])