此Keras模型在创建时工作,但在加载时失败。张量分裂

此Keras模型在创建时工作,但在加载时失败。张量分裂,keras,deep-learning,lstm,tensor,autoencoder,Keras,Deep Learning,Lstm,Tensor,Autoencoder,我正在试验LSTM,具体来说,将一个序列输入一个LSTM,将状态转移到另一个LSTM,然后对序列进行解码。我在两个LSTM之间添加了一个自动编码器,通过低维潜在空间对传输的状态进行编码和解码 当我创建模型并对其进行拟合时,这种方法效果很好。但是,如果我保存此模型,然后尝试继续对其进行训练,或者甚至在不进行额外训练的情况下仅使用它,则该模型不会运行,我会收到以下警告: 回溯(最近一次呼叫最后一次): 文件“s2s_AE_2.py”,第140行,中 model.fit_生成器(train_gener

我正在试验LSTM,具体来说,将一个序列输入一个LSTM,将状态转移到另一个LSTM,然后对序列进行解码。我在两个LSTM之间添加了一个自动编码器,通过低维潜在空间对传输的状态进行编码和解码

当我创建模型并对其进行拟合时,这种方法效果很好。但是,如果我保存此模型,然后尝试继续对其进行训练,或者甚至在不进行额外训练的情况下仅使用它,则该模型不会运行,我会收到以下警告:

回溯(最近一次呼叫最后一次):
文件“s2s_AE_2.py”,第140行,中
model.fit_生成器(train_generator(),callbacks=[checkpointer],每_epoch的步骤=30,epoch=2000,verbose=1,validation_data=val_generator(),validation_步骤=30)
文件“C:\ProgramData\Anaconda3\lib\site packages\keras\legacy\interfaces.py”,第91行,在包装器中
返回函数(*args,**kwargs)
文件“C:\ProgramData\Anaconda3\lib\site packages\keras\engine\training.py”,第2224行,在fit_generator中
等级重量=等级重量)
文件“C:\ProgramData\Anaconda3\lib\site packages\keras\engine\training.py”,第1877行,在批处理的列中
等级重量=等级重量)
文件“C:\ProgramData\Anaconda3\lib\site packages\keras\engine\training.py”,第1476行,在用户数据中
异常(前缀为“输入”)
文件“C:\ProgramData\Anaconda3\lib\site packages\keras\engine\training.py”,第86行,输入数据
str(len(data))+'数组:'+str(data)[:200]+'…')
ValueError:检查模型输入时出错:传递给模型的Numpy数组列表的大小不是模型预期的大小。预期会看到1个数组,但得到了以下2个数组的列表:[array([[[0.47338937,0.75865918,0.37731877,0.63840222,,
0.14653083],
[ 0.52119932,  0.78308798,  0.45885839,  0.66738276,
0.20393343],
[ 0.5674261 ,  0.806364... 
我的代码如下:

来自keras.models导入模型
从keras.layers导入输入、LSTM、密集、时间分布、Lambda、辍学、激活、RepeatVector
从keras.callbacks导入模型检查点
将numpy作为np导入
从keras.layers导入Lambda,连接
从keras导入后端为K
从keras.models导入负载_模型
导入操作系统
序号长度=150
特征数量=5
LSTM_潜在尺寸=40
AE_潜在尺寸=10
编码器输入=输入(形状=(序列长度、特征数量))
编码器=LSTM(LSTM\U潜伏\U dim,返回\U状态=真)
编码器输出,状态h,状态c=编码器(编码器输入)
合并编码器状态=连接(轴=-1)([状态h,状态c])
编码状态=密集(AE_潜伏状态,激活='relu')(合并编码器状态)
解码状态=密集(LSTM隐藏状态*2,激活='relu')(编码状态)
解码器输入=输入(形状=(1,特征数量))
解码器\u lstm=lstm(lstm\u潜在\u dim,返回\u序列=True,返回\u状态=True)
解码器密度=密度(特征数量)
所有_输出=[]
输入=解码器输入
状态=[解码状态[:,:LSTM\U潜伏状态],解码状态[:,LSTM\U潜伏状态:]
对于范围内的(顺序长度):
#在一个时间步上运行解码器
输出,状态h,状态c=解码器lstm(输入,初始状态=状态)
输出=解码器密度(输出)
#存储当前预测(稍后我们将连接所有预测)
所有_输出。追加(输出)
#重新输入输出作为下一个循环迭代的输入
#以及更新状态
输入=输出
状态=[状态h,状态c]
#连接所有预测
解码器_输出=λ(λx:K.串联(x,轴=1))(所有_输出)
模型=模型([编码器输入,解码器输入],解码器输出)
#模型=负荷模型('pre\u model.h5')
_w的文件路径_='AE2_p2p_s2s_model.h5'
尝试:
model=load_model(filepath_for_w)#如果模型以前运行过,请从它继续
打印(“加载的模型”)
除外:打印(“新型号”)
打印(model.summary())
compile(loss='mean\u squared\u error',optimizer='adam')
def创建波长(最小波长、最大波长、波长中的通量、类别):
#类别:0-列车;2-验证;4-测试。1;3;5-死区
c=(category+np.random.random())/6
k=通量(单位:波长)
#
base=(np.trunc(k*np.random.random()*(max\u波长-min\u波长))+k*min\u波长)/k
答案=基数+c/k
返回(答复)
def制造线(长度、类别):
shift=np.random.random()
波长=创建波长(30,10,1,类别)
a=np.arange(长度)
答案=np.sin(a/波长+位移)
回覆
def制造数据(序号、序号、尺寸、类别):
数据=np.数组([])。重塑(0,序列长度,尺寸)
对于范围内的i(序号):
mini_data=np.数组([]).重塑(0,序号)
对于范围内的j(尺寸):
行=制造行(序号、类别)
线条=线条。重塑(1,序号)
迷你们数据=np.append(迷你们数据,线,轴=0)
mini_数据=np.Swapax(mini_数据,1,0)
迷你数据=迷你数据。重塑(1,序列长度,尺寸)
数据=np.append(数据,最小数据,轴=0)
返回(数据)
def列_发生器():
尽管如此:
序列长度=序列长度+1
数据=生成数据(1000,序列长度,特征数量,0)#类别=列车中的0
#   
编码器输入数据=数据[:,1:,:]#全部
#               
解码器_输入_数据=数据[:,0,:]#序列中的第一个值
解码器输入数据=解码器输入数据。整形((解码器输入数据。形状[0],1,解码器输入数据。形状[1]))
#
#       
解码器\目标\数据=编码器\输入\数据
产生[编码器输入数据,解码器输入数据],解码器目标数据
def val_生成器():
尽管如此:
序列长度=序列长度+1
数据=生成数据(1000,序列长度,特征数量,2)#类别=val中的2
#       
#       
##解码器_目标_数据与解码器_输入_数据相同,但偏移了一个时间步
#       
编码器输入