Python 使用MXNet后端时,Keras无法加载模型权重
我正在尝试填补半小时碳通量时间序列的空白。我想使用训练测试验证交叉验证来识别最节省的LSTM模型,方法是使用所有可用输入训练一个模型,然后修剪它,直到分数停止提高。对于每个模型,我使用k-fold CV分割90%的训练,10%的验证,然后在model.fit()中,将训练进一步分割为训练集和测试集。我使用提前停止来帮助最小化运行时间,并使用ModelCheckpoint来保存最佳权重(具有最低“val_损失”的历元)。然后,我想加载这些模型权重,并使用测试集上表现最好的权重,在模型外部为验证留出的10%数据上计算验证分数(MSE) 下面是一个代码训练LSTM的工作示例,其中包含9个因子和13个时间(每次观察前的6个小时) 这里是我的数据集的几行——实际的序列有1000个观察值Python 使用MXNet后端时,Keras无法加载模型权重,python,tensorflow,keras,mxnet,Python,Tensorflow,Keras,Mxnet,我正在尝试填补半小时碳通量时间序列的空白。我想使用训练测试验证交叉验证来识别最节省的LSTM模型,方法是使用所有可用输入训练一个模型,然后修剪它,直到分数停止提高。对于每个模型,我使用k-fold CV分割90%的训练,10%的验证,然后在model.fit()中,将训练进一步分割为训练集和测试集。我使用提前停止来帮助最小化运行时间,并使用ModelCheckpoint来保存最佳权重(具有最低“val_损失”的历元)。然后,我想加载这些模型权重,并使用测试集上表现最好的权重,在模型外部为验证留出
datetime,co2_flux,ch4_flux,ustar,wind_speed,AirTC_Avg,air_pressure,AirTC_Min,RH,PPFD_Avg,NR_Wm2_Avg,VWC,Temp,Sedge,Shrubby
7/11/2016 8:00,-0.337747167,0.011732699,0.404379747,3.887986435,15.07,101118.6513,15.03,92.7,414.2,225.1,0.5895,7.950660426,0.001292044,0.823794007
7/11/2016 8:30,-1.021087283,0.010256442,0.424094541,3.94983083,14.89,101144.0926,14.84,92.8,339.7,177.1,0.5895,8.24119905,0.001058732,0.826866339
7/11/2016 9:00,-0.146511388,0.008503355,0.456274817,4.687202214,14.71,101177.3176,14.63,93.4,354.4,183.7,0.5895,8.146344257,0.000474955,0.84272365
7/11/2016 9:30,0.144368521,0.009458078,0.462915317,4.810986576,14.27,101203.9191,14.2,93.3,370.2,188.4,0.5895,7.995179025,0.00147768,0.854715683
7/11/2016 10:00,1.471425801,0.014895985,0.47095652,5.098075355,13.7,101235.9171,13.62,94.3,462.9,233.9,0.5895,7.521166721,4.64E-05,0.871581919
7/11/2016 10:30,0.889911286,0.01564225,0.487227522,4.969666239,13.13,101277.0195,13.04,96,309.9,155.2,0.5895,7.923818563,8.14E-06,0.880709962
当我在后台运行Tensorflow时,一切都很顺利,我得到了一个。但是,如果我尝试使用MXNet后端运行它,它将无法加载保存模型权重,我将得到以下回溯:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-14c6597a2feb> in <module>()
114 Model = CH4_Model
115 Best = LSTM_Optimize(Path,y_var)
--> 116 Best.Run(Model)
117 print()
118 print("--- %s seconds ---" % (time.time() - start_time))
<ipython-input-1-14c6597a2feb> in Run(self, Inputs)
96 shuffle=True,callbacks=[ES,CH,HS],verbose=0)
97 Y = Mod.predict(Xscale[test],batch_size = batch_size)
---> 98 Mod.load_weights('weights.hdf5')
99 Y = Mod.predict(Xscale[test],batch_size = batch_size)
100 MSE.append(metrics.mean_squared_error(self.y[test],Y))
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/engine/topology.py in load_weights(self, filepath, by_name)
2718 self.load_weights_from_hdf5_group_by_name(f)
2719 else:
-> 2720 self.load_weights_from_hdf5_group(f)
2721
2722 if hasattr(f, 'close'):
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/engine/topology.py in load_weights_from_hdf5_group(self, f)
2804 weight_values[0] = w
2805 weight_value_tuples += zip(symbolic_weights, weight_values)
-> 2806 K.batch_set_value(weight_value_tuples)
2807
2808 def load_weights_from_hdf5_group_by_name(self, f):
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/backend/mxnet_backend.py in batch_set_value(tuples)
2205 """
2206 for p, w in tuples:
-> 2207 set_value(p, w)
2208
2209
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/backend/mxnet_backend.py in set_value(x, value)
2193 if isinstance(value, Number):
2194 value = [value]
-> 2195 x.bind(mx.nd.array(value))
2196
2197
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in array(source_array, ctx, dtype)
1295 raise TypeError('source_array must be array like object')
1296 arr = empty(source_array.shape, ctx, dtype)
-> 1297 arr[:] = source_array
1298 return arr
1299
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in __setitem__(self, key, value)
384 _internal._set_value(float(value), out=self)
385 elif isinstance(value, (np.ndarray, np.generic)):
--> 386 self._sync_copyfrom(value)
387 else:
388 raise TypeError(
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in _sync_copyfrom(self, source_array)
556 print(self.shape)
557 raise ValueError('Shape inconsistent: expected %s vs got %s'%(
--> 558 str(self.shape), str(source_array.shape)))
559 check_call(_LIB.MXNDArraySyncCopyFromCPU(
560 self.handle,
ValueError: Shape inconsistent: expected () vs got (1,)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
114型=CH4_型
115最佳=LSTM_优化(路径,y_变量)
-->116最佳跑步(模型)
117印刷品()
118打印(“--%s秒--”%(time.time()-start_time))
运行中(自身、输入)
96 shuffle=True,回调=[ES,CH,HS],verbose=0)
97 Y=模型预测(Xscale[测试],批次大小=批次大小)
--->98模块负载重量('weights.hdf5')
99 Y=模型预测(Xscale[测试],批量大小=批量大小)
100毫秒附加(度量均方误差(self.y[test],y))
/加载权重中的usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/Keras/engine/topology.py(self,filepath,按名称)
2718.按组名称(f)从组hdf5中加载权重
2719其他:
->2720自加载来自hdf5组(f)的重量
2721
2722如果hasattr(f,“关闭”):
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/Keras/engine/topology.py来自hdf5组(self,f)的负载权重
2804权重值[0]=w
2805权重值元组+=zip(符号权重、权重值)
->2806 K.批次设置值(重量值元组)
2807
2808 def按组名(自身,f)从组中加载权重:
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/Keras/backend/mxnet\u backend.py in batch\u set\u值(元组)
2205 """
2206对于元组中的p,w:
->2207设定值(p,w)
2208
2209
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/Keras/backend/mxnet\u backend.py in set\u值(x,值)
2193如果存在(值、编号):
2194值=[值]
->2195 x.bind(mx.nd.数组(值))
2196
2197
/数组中的usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py(源数组,ctx,dtype)
1295 raise TypeError('source_数组必须是类似数组的对象')
1296 arr=empty(source_array.shape,ctx,dtype)
->1297 arr[:]=源_数组
1298返回arr
1299
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in_uuuusetitem_uuu(self、key、value)
384内部设置值(浮动(值),输出=自身)
385 elif isinstance(值,(np.ndarray,np.generic)):
-->386自同步复制源(值)
387其他:
388 raise TYPE错误(
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in_sync_copyfrom(自同步、源阵列)
556打印(自成型)
557 raise VALUERROR('形状不一致:预期为%s,实际为%s'%(
-->558 str(self.shape),str(source_array.shape)))
559检查调用(_LIB.MXNDArraySyncCopyFromCPU(
560自我处理,
ValueError:形状不一致:应为()vs Get(1,)
为什么我要使用MXNet?它似乎比tensorflow快,而且我必须对许多具有不同输入、不同节点和超参数的模型执行训练测试验证。通过使用多处理来训练多个不同的模型,我已经能够显著提高具有MXNet后端的keras模型的速度然而,使用tensroflow后端,我在尝试进行多处理时遇到线程锁定错误
在上下文中,我正在p2.xlarge实例上使用深度学习AMI Ubuntu Linux-2.3_Sep2017(AMI-d6ee1dae)环境
如果您有任何想法,我们将不胜感激。MXNet后端LSTM层使用MXNet,需要静态声明桶大小(长度),但Keras和TF支持动态长度。因此,您会发现加载模型权重和形状不匹配的问题 目前正在使用MXNet后端添加Keras2支持,在Keras2中应该注意这个问题。
MXNet后端LSTM层使用MXNet,需要静态声明桶大小(长度),但是,Keras和TF支持动态长度。因此,您会发现加载模型权重和形状不匹配的问题 目前正在使用MXNet后端添加Keras2支持,在Keras2中应该注意这个问题。
嘿,你明白了吗?没有使用MXNet,我放弃了它,转而使用tensorflow。我明白了如何使用tensorflow实现多处理以同时训练测试验证模型。嘿,你明白了吗?没有使用MXNet,我放弃了它,转而使用tensorflow。我明白了如何使用tensorflo实现多处理w训练
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-14c6597a2feb> in <module>()
114 Model = CH4_Model
115 Best = LSTM_Optimize(Path,y_var)
--> 116 Best.Run(Model)
117 print()
118 print("--- %s seconds ---" % (time.time() - start_time))
<ipython-input-1-14c6597a2feb> in Run(self, Inputs)
96 shuffle=True,callbacks=[ES,CH,HS],verbose=0)
97 Y = Mod.predict(Xscale[test],batch_size = batch_size)
---> 98 Mod.load_weights('weights.hdf5')
99 Y = Mod.predict(Xscale[test],batch_size = batch_size)
100 MSE.append(metrics.mean_squared_error(self.y[test],Y))
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/engine/topology.py in load_weights(self, filepath, by_name)
2718 self.load_weights_from_hdf5_group_by_name(f)
2719 else:
-> 2720 self.load_weights_from_hdf5_group(f)
2721
2722 if hasattr(f, 'close'):
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/engine/topology.py in load_weights_from_hdf5_group(self, f)
2804 weight_values[0] = w
2805 weight_value_tuples += zip(symbolic_weights, weight_values)
-> 2806 K.batch_set_value(weight_value_tuples)
2807
2808 def load_weights_from_hdf5_group_by_name(self, f):
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/backend/mxnet_backend.py in batch_set_value(tuples)
2205 """
2206 for p, w in tuples:
-> 2207 set_value(p, w)
2208
2209
/usr/local/lib/python3.5/dist-packages/Keras-1.2.2-py3.5.egg/keras/backend/mxnet_backend.py in set_value(x, value)
2193 if isinstance(value, Number):
2194 value = [value]
-> 2195 x.bind(mx.nd.array(value))
2196
2197
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in array(source_array, ctx, dtype)
1295 raise TypeError('source_array must be array like object')
1296 arr = empty(source_array.shape, ctx, dtype)
-> 1297 arr[:] = source_array
1298 return arr
1299
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in __setitem__(self, key, value)
384 _internal._set_value(float(value), out=self)
385 elif isinstance(value, (np.ndarray, np.generic)):
--> 386 self._sync_copyfrom(value)
387 else:
388 raise TypeError(
/usr/local/lib/python3.5/dist-packages/mxnet-0.11.0-py3.5.egg/mxnet/ndarray.py in _sync_copyfrom(self, source_array)
556 print(self.shape)
557 raise ValueError('Shape inconsistent: expected %s vs got %s'%(
--> 558 str(self.shape), str(source_array.shape)))
559 check_call(_LIB.MXNDArraySyncCopyFromCPU(
560 self.handle,
ValueError: Shape inconsistent: expected () vs got (1,)