Python 只有在使用验证生成器时,Keras才会在第一个历元时卡住

Python 只有在使用验证生成器时,Keras才会在第一个历元时卡住,python,keras,deep-learning,Python,Keras,Deep Learning,我正在读一本关于深度学习的书,书名是。这本书在代码方面很旧,但我阅读了官方文档才看完。无论如何 这是一个程序,旨在使用可用的数据集训练一个简单的温度时间序列预测模型 节目是这样的 将numpy导入为np 从keras.models导入顺序 从keras导入图层 从keras.optimizers导入RMSprop #加载文件 f=打开(fname)#fname是csv文件的文件路径 data=f.read() f、 关闭() lines=data.split('\n') 页眉=行[0]。拆分(“

我正在读一本关于深度学习的书,书名是。这本书在代码方面很旧,但我阅读了官方文档才看完。无论如何

这是一个程序,旨在使用可用的数据集训练一个简单的温度时间序列预测模型

节目是这样的

将numpy导入为np
从keras.models导入顺序
从keras导入图层
从keras.optimizers导入RMSprop
#加载文件
f=打开(fname)#fname是csv文件的文件路径
data=f.read()
f、 关闭()
lines=data.split('\n')
页眉=行[0]。拆分(“,”)
行=行[1:]
#转换成numpy数组
float_data=np.零((len(行),len(标题)-1))
对于i,枚举中的行(行):
值=[x行中x的浮点(x)。拆分(',')[1:]
float_data[i,:]=值
#规范化数据
平均值=浮点数据[:200000]。平均值(轴=0)
浮点数据-=平均值
标准=浮点数据[:200000]。标准(轴=0)
浮点数数据/=标准
有一个用于创建数据集的生成器函数(我读过
tensorflow.keras.utils.Sequence
是首选,但我未能将此生成器转换为Sequence子类

def生成器(数据、回望、延迟、最小索引、最大索引、随机播放=False、批次大小=128、步骤=6):
如果最大索引为“无”:
最大索引=len(数据)-延迟-1
i=最小索引+回望
而1:
如果随机播放:
rows=np.random.randint(最小索引+回溯,最大索引,大小=批量大小)
其他:
如果i+批次大小>=最大索引:
i=最小索引+回望
行=np.arange(i,最小值(i+批量大小,最大索引))
i+=len(行)
samples=np.zero((len(行),lookback//step,data.shape[-1]))
目标=np.0((列)
对于j,枚举中的行(行):
索引=范围(行[j]-回望,行[j],步长)
样本[j]=数据[指数]
目标[j]=数据[行[j]+延迟][1]
产出样本、目标
以下是参数的详细信息

1)
数据
-浮点数据的原始数组,标准化

2)
lookback
-输入数据应该返回多少时间步

3)
延迟
-目标在未来的时间步数

4)
min_index
max_index
—数据数组中的索引,用于限定要从中提取的时间步。这对于保存一段数据进行验证和另一段数据进行测试非常有用

5)
shuffle
-是将样本洗牌还是按时间顺序绘制样本

6)
批次大小
-每批次的样本数量

7)
步骤
—采样数据的时间段,以时间步为单位。您将在中设置为6 命令每小时绘制一个数据点

这些发电机呢

lookback=1440
步骤=6
延迟=144
批量大小=128
列车发电机=发电机(浮动数据,
回顾,
延迟=延迟,
最小指数=0,
最大指数=200000,
洗牌=正确,
步骤=步骤,
批次大小=批次大小)
val_gen=发电机(浮动数据,
回顾,
延迟=延迟,
最小指数=200001,
最大指数=300000,
步骤=步骤,
批次大小=批次大小)
测试发电机=发电机(浮动数据,
回顾,
延迟=延迟,
最小指数=300001,
最大索引=无,
步骤=步骤,
批次大小=批次大小)
val_步长=(300000-200001-回望)
测试步骤=(len(浮动数据)-300001-回望)
网络布局如下所示

model=Sequential()
model.add(layers.flatte(input_shape=(lookback//step,float_data.shape[-1]))
model.add(layers.Dense(32,activation='relu'))
模型。添加(层。密集(1))
compile(优化器=RMSprop(),loss='mae')
compile(优化器=RMSprop(),loss='mae')
历史=模型拟合(列车生成,每个历元的步骤=500,历元=20,验证数据=测试生成,验证步骤=测试步骤)
然而,这个模型却陷入了困境

Train for 500 steps, validate for 119110 steps
Epoch 1/20
497/500 [============================>.] - ETA: 0s - loss: 0.3524
我的模型在验证集上进行评估时卡住了。确保
train\u gen
val\u gen
我试过的地方正常

next(train_gen)
next(val_gen)
它们每次都显示不同的值,就像

(array([[[ 0.34593055,  0.49507501,  0.4628141 , ...,  0.16203687,
           0.18470667,  0.84378526],
         [ 0.36243914,  0.6283707 ,  0.59460993, ...,  0.2921889 ,
           0.94414397,  0.60710086],
         [ 0.35182647,  0.64305582,  0.60912981, ...,  1.78242962,
           1.59631612,  0.43507171],
         ...,

这里有什么问题?

验证步骤的数量看起来可疑,因为它不是用批量大小计算的,因此它比应该的要大,这将大大延长验证阶段的时间。解决方案是将步骤数除以批次大小:

val_steps = val_steps // batch_size
test_steps = test_steps // batch_size

这将使步骤具有正确的值。

您确定测试步骤正确吗?您没有使用批大小来计算它,因此它可能比需要的大得多。请尝试减少批大小size@DulangaHeshan我试过了,不是吗work@Dr.Snoopy我不确定,这是我在书中遵循的一个例子问题是这些步骤计算没有使用批量大小,所以它们都是错误的,因为步骤的数量随批次大小而变化。最后,如果您为验证步骤设置的值远远大于所需的值,将使验证阶段花费更长的时间,这可能会被卡住。我建议您按照批量大小划分这些步骤