Python 如何使用经过训练和保存的前馈神经网络对新数据进行预测

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

我正在尝试使用经过训练和保存的模型对新数据进行预测。我的新数据与用于构建保存模型的数据的形状不同

我尝试过使用model.save()和model.save_weights(),因为我仍然希望保留训练配置,但它们都会产生相同的错误

是否有一种方法可以在新数据上使用保存的模型,即使形状不同

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
可能因培训或测试数据集的大小而异

如果您打算重新培训您的人际网络,那么整个培训/评估过程以简单的形式如下:

  • 假设您在CSV文件
    data.CSV
    中有一个数据集。例如,您总共有126行和17列

  • 以某种方式读取数据,例如通过标准python或标准python。将数据转换为数字(浮点)

  • 将数据按行随机分为两部分,大致为相应大小的行,如110行
    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')
    ])