Python Keras:使用predict_生成器预测新值

Python Keras:使用predict_生成器预测新值,python,machine-learning,keras,prediction,Python,Machine Learning,Keras,Prediction,目前,我正在尝试学习Keras中的温度预测示例(如F.Chollet的《Python深度学习》一书第6.3章所述)。我在使用指定的生成器进行预测时遇到一些问题。我的理解是,我应该使用model.predict\u generator进行预测,但我不确定如何将steps参数用于此方法,以及如何恢复对原始数据正确“形状”的预测 理想情况下,我希望能够绘制测试集(指数300001,直到结束),并绘制我对该测试集的预测(即具有预测值的相同长度的数组) 示例(此处提供的数据集:)如下所示: 将numpy导

目前,我正在尝试学习Keras中的温度预测示例(如F.Chollet的《Python深度学习》一书第6.3章所述)。我在使用指定的生成器进行预测时遇到一些问题。我的理解是,我应该使用
model.predict\u generator
进行预测,但我不确定如何将
steps
参数用于此方法,以及如何恢复对原始数据正确“形状”的预测

理想情况下,我希望能够绘制测试集(指数300001,直到结束),并绘制我对该测试集的预测(即具有预测值的相同长度的数组)

示例(此处提供的数据集:)如下所示:

将numpy导入为np
#读入数据
fname=('jena_climate_2009_2016.csv')
f=打开(fname)
data=f.read()
f、 关闭()
lines=data.split('\n')
col_names=行[0]。拆分(“,”)
col_names=[i.replace(“,”)替换col_names中的i]
#规范化数据
float_data=np.array(df.iloc[:,1:])
温度=浮点数据[:,1]
平均值=浮点数据[:200000]。平均值(轴=0)
浮点数据-=平均值
标准=浮点数据[:200000]。标准(轴=0)
浮点数数据/=标准
def生成器(数据、回溯、延迟、最小索引、最大索引、随机播放=False、批次大小=128、步长=6):
如果最大索引为“无”:
最大索引=len(数据)-延迟-1
i=最小索引+回望
而1:
如果随机播放:
行=np.random.randint(
最小索引+回望,最大索引,大小=批量大小)
其他:
如果i+批次大小>=最大索引:
i=最小索引+回望
行=np.arange(i,最小值(i+批量大小,最大索引))
i+=len(行)
样本=np.零((len)(行),
回顾//step,
data.shape[-1]))
目标=np.0((列)
对于j,枚举中的行(行):
索引=范围(行[j]-回望,行[j],步长)
样本[j]=数据[指数]
目标[j]=数据[行[j]+延迟][1]
产量(样本、目标)
回望=720
步骤=6
延迟=144
列车发电机=发电机(浮动数据,回望=回望,延迟=延迟,
最小索引=0,最大索引=200000,随机播放=True,
步骤=步骤,批次大小=批次大小)
val_gen=发生器(浮点数据,回望=回望,延迟=延迟,
最小指数=200001,最大指数=300000,步长=step,
批次大小=批次大小)
测试发电机=发电机(浮动数据,回望=回望,延迟=延迟,
最小指数=300001,最大指数=无,步长=步长,
批次大小=批次大小)
val_步长=(300000-200001-回望)
测试步骤=(len(浮动数据)-300001-回望)
从keras.models导入顺序
从keras导入图层
从keras.optimizers导入RMSprop
模型=顺序()
model.add(layers.flatte(input_shape=(lookback//step,float_data.shape[-1]))
model.add(layers.Dense(32,activation='relu'))
模型。添加(层。密集(1))
compile(优化器=RMSprop(),loss='mae')
型号安装发电机(发电机组,每小时步数=500,
历元=20,验证数据=val\u gen,
验证(步骤=验证(步骤)
在网上搜索之后,我尝试了以下类似的技术:

pred = model.predict_generator(test_gen, steps=test_steps // batch_size)

但是,我得到的预测数组太长,与我的原始数据完全不匹配。有人有什么建议吗?

预测生成器中
对于
步骤
将测试路径中的图像数除以
测试生成中提供的批大小
例如:我有
50张
图像,我提供的批量大小为
10
,而不是
5

#first seperate the `test images` and `test labels`
 test_images,test_labels = next(test_gen)

#get the class indices
 test_labels = test_labels[:,0]  #this should give you array of labels

predictions = model.predict_generator(test_gen,steps = number of images/batchsize,verbose=0)

predictions[:,0]  #this is your actual predictions  

当我对自己的问题找到了一个半可接受的答案时,我决定将其发布给子孙后代:

test_gen = generator(float_data, lookback=lookback, delay=delay, 
                     min_index=300001, max_index=None, step=step, 
                     batch_size=1)    # "reset" the generator

pred = model.predict_generator(test_gen, steps=test_steps)
现在,这是我想根据我的原始测试集绘制的形状。我还可以使用受此启发的更手动的方法:


您的原始代码看起来是正确的:

pred = model.predict_generator(test_gen, steps=test_steps // batch_size)
我试过了,但没有发现生成长度约为120k的
pred
有任何问题。您得到了多大的尺寸

实际上,代码中的两个步骤都不正确。它们应该是:

val_steps = (300000 - 200001 - lookback) // batch_size
test_steps = (len(float_data) - 300001 - lookback) // batch_size
(你的验证不是要花很长时间才能在每个时代运行吗?)

当然,有了这个修正,你可以简单地使用

pred = model.predict_generator(test_gen, steps=test_steps)

对于现在看这个问题的任何人,在使用较新版本的keras的
predict\u generator
时,我们不需要指定steps参数。参考:

如果提供值,将生成
step*batch\u size
示例的预测。这可能导致排除
len(test)%batch\u size
行,如OP所述。 此外,在我看来,设置
batch_size=1
会破坏使用生成器的目的,因为它相当于逐个迭代测试数据。
类似地设置
steps=1
(当
test\u generator
中未设置
batch\u size
时)将一次读取整个测试数据,这对于大型测试数据来说并不理想。

谢谢你的回答。不幸的是,对于我尝试使用的数据集,它不是图像数据,而是时间序列。如果我尝试像上面那样将
数据
标签
分开,那么我的
标签
数组的形状将为
(128,)
,即与
批量大小
相同。那么当然,我将无法使用您的下一行代码来获取类索引,因为形状与我直接从提到的书(第212页)中获得的
val\u步骤
test\u步骤
不匹配是的,我的验证确实花了很长的时间来运行每个历元!我的
pred
是长度
test\u步骤-(test\u步骤%batch\u大小)
,即1198
pred = model.predict_generator(test_gen, steps=test_steps)