Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在TF1.15中创建有状态的TensorFlowLite RNN模型_Python_Tensorflow_Deep Learning_Recurrent Neural Network_Tensorflow Lite - Fatal编程技术网

Python 如何在TF1.15中创建有状态的TensorFlowLite RNN模型

Python 如何在TF1.15中创建有状态的TensorFlowLite RNN模型,python,tensorflow,deep-learning,recurrent-neural-network,tensorflow-lite,Python,Tensorflow,Deep Learning,Recurrent Neural Network,Tensorflow Lite,我已经能够使用下面的代码实现一个无状态模型 导入操作系统 os.environ['TF\u ENABLE\u CONTROL\u FLOW\u V2']=“1” 导入tensorflow作为tf 从tensorflow_core.python.keras.models导入模型,顺序 从tensorflow_core.python.keras.layers.core导入稠密、激活、Lambda、重塑 从tensorflow_core.python.keras.engine.input_层导入输入

我已经能够使用下面的代码实现一个无状态模型

导入操作系统
os.environ['TF\u ENABLE\u CONTROL\u FLOW\u V2']=“1”
导入tensorflow作为tf
从tensorflow_core.python.keras.models导入模型,顺序
从tensorflow_core.python.keras.layers.core导入稠密、激活、Lambda、重塑
从tensorflow_core.python.keras.engine.input_层导入输入
从tensorflow_core.python.keras.layers.RNN,StackedRNNCells
从tensorflow_core.lite.experimental.examples.lstm.rnn_单元导入TFLiteLSTMCell、TfLiteRNNCell
从tensorflow_core.lite.experimental.examples.lstm.rnn导入动态
从tensorflow_core.python.ops.rnn_cell_impl导入LSTMStateTuple
def buildRNNLayer(输入、rnn_单元):
“”“构建lstm层。
Args:
输入:输入数据。
num_layers:我们需要多少个LSTM层。
num_units:LSTM单元中隐藏单元的数量。
"""
rnn\u层=堆叠的rnn单元(rnn\u单元)
#假设输入的大小为[批次、时间、输入大小],那么我们将
#转换成时间专业。
转置输入=tf.transpose(输入,perm=[1,0,2])
输出,=动态(
rnn_层,
转置的_输入,
dtype='float32',
时间(主=真)
未堆叠的_输出=tf。未堆叠(输出,轴=0)
返回未堆叠的_输出[-1]
def build_rnn_lite(型号):
tf.reset_default_graph()
#构造RNN
单元格=[]
对于范围(3)中的图层:
如果模型='LSTMLite':
append(TFLiteLSTMCell(192,name='lstm{}'。格式(层)))
其他:
append(tfliternCell(192,name='rnn{}'。格式(层)))
规格输入=输入(形状=(5,64,),名称='rnn\U in',批次大小=8192)
x=Lambda(buildRNNLayer,参数={'rnn_cells':cells},name=model.lower())(spec_输入)
out=密集型(64,激活='sigmoid',名称='fin_密集型')(x)
返回模型(输入=规格输入,输出=输出)
模型=构建文件('LSTMLite')
######TF-LITE转换
sess=tf.keras.backend.get_session()
input\u tensor=sess.graph.get\u tensor\u by\u name('rnn\u in:0'))
output_tensor=sess.graph.get_tensor_by_name('fin_densite/Sigmoid:0'))
converter=tf.lite.TFLiteConverter.from_session(sess、[input_tensor]、[output_tensor])
tflite=converter.convert()
打印('Model converted successfully!')
这很好,我正在尝试创建一个有状态模型,也就是说,通过更改下面的代码,将以前的状态与输入一起提供

def buildRNNLayer(输入、rnn单元、初始状态=无):
“”“构建lstm层。
Args:
输入:输入数据。
num_layers:我们需要多少个LSTM层。
num_units:LSTM单元中隐藏单元的数量。
"""
#假设输入的大小为[批次、时间、输入大小],那么我们将
#转换成时间专业。
转置输入=tf.transpose(输入,perm=[1,0,2])
输出,新状态=动态(
rnn_细胞,
转置的_输入,
初始状态=初始状态,
dtype='float32',
时间(主=真)
未堆叠的_输出=tf。未堆叠(输出,轴=0)
返回未堆叠的_输出[-1],新_状态
def build_rnn_lite(模型,状态=False):
tf.reset_default_graph()
#构造RNN
单元格=[]
对于范围(3)中的图层:
如果模型='LSTMLite':
append(TFLiteLSTMCell(192,name='lstm{}'。格式(层)))
其他:
append(tfliternCell(192,name='rnn{}'。格式(层)))
单元格=堆叠的单元格(单元格)
状态=单元格。获取初始状态(批处理大小=1,数据类型=tf.float32)
如果说明:
规格输入=输入(形状=(5,64,),名称='rnn\U in',批次大小=1)
x、 state=Lambda(buildRNNLayer,arguments={'rnn_cells':cells,'initial_state':state},name=model.lower())(spec_输入)
其他:
规格输入=输入(形状=(5,64),名称='rnn\u in')
x、 state=Lambda(buildRNNLayer,参数={'rnn_cells':cells},name=model.lower())(spec_输入)
out=密集型(64,激活='sigmoid',名称='fin_密集型')(x)
返回模型(输入=规格输入,输出=[输出,状态])
model=build_rnn_lite('LSTMLite',True)
in_rnn=np.random.randn(1,5,64)
out1=模型预测(单位:N)
out2=模型预测(单位:N)
######TF-LITE转换
sess=tf.keras.backend.get_session()
input\u tensor=sess.graph.get\u tensor\u by\u name('rnn\u in:0'))
output_tensor=sess.graph.get_tensor_by_name('fin_densite/Sigmoid:0'))
converter=tf.lite.TFLiteConverter.from_session(sess、[input_tensor]、[output_tensor])
tflite=converter.convert()
打印('Model converted successfully!')
在上述更改的代码中,
out1
out2
都是相同的。如果重新使用状态而不是重置状态,则不应出现这种情况。需要进行哪些其他更改以确保输出的新_状态用于下一批而不是重置状态

def get_state_变量(批次大小、单元格):
#对于每个层,获取初始状态并从中生成变量
#以启用更新其值。
状态变量=[]
对于状态_c,单元格中的状态_h.zero_状态(批处理大小,tf.float32):
state_variables.append(tf.contrib.rnn.LSTMStateTuple(
tf.变量(状态c,可训练=假),
tf.变量(状态h,可训练=假)
#以元组的形式返回,这样就可以将其作为初始状态馈送给动态rnn
返回元组(状态变量)
def get_state_update_op(状态变量、新状态):
#添加一个操作,用最后一个状态张量更新列车状态
更新_ops=[]
对于状态变量,zip中的新状态(状态变量,新状态):
#将新状态分配给该层上的状态变量
update_ops.extend([state_variable[0]。assign(new_state[0]),
状态变量[1]。赋值(新状态[1]))
#返回一个元组,以便将所有更新操作合并到一个操作中。
#不应使用元组的实际值。