Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 如何处理Keras函数模型API中批量规范化的更新操作?_Python_Tensorflow_Keras_Model_Batch Normalization - Fatal编程技术网

Python 如何处理Keras函数模型API中批量规范化的更新操作?

Python 如何处理Keras函数模型API中批量规范化的更新操作?,python,tensorflow,keras,model,batch-normalization,Python,Tensorflow,Keras,Model,Batch Normalization,我正在尝试Keras模型的函数API,并尝试使用相同的模型和权重共享建立两个数据集流,这也包括批处理规范化。当我在第一个数据流上创建模型,然后在第二个数据流上调用它时,我可以在tensorboard中看到额外的更新操作,但是模型不包括这些新创建的操作。我的问题是,在仍然能够使用经典的tensorflow会话、数据集迭代器和自定义的loss和优化器的情况下,对于这种场景,一种好的编码方法应该是什么样的 我附上了一些代码,展示了我请求的行为在BatchNormalization层本身中的实际工作方式

我正在尝试Keras模型的函数API,并尝试使用相同的模型和权重共享建立两个数据集流,这也包括批处理规范化。当我在第一个数据流上创建模型,然后在第二个数据流上调用它时,我可以在tensorboard中看到额外的更新操作,但是模型不包括这些新创建的操作。我的问题是,在仍然能够使用经典的tensorflow会话、数据集迭代器和自定义的loss和优化器的情况下,对于这种场景,一种好的编码方法应该是什么样的

我附上了一些代码,展示了我请求的行为在BatchNormalization层本身中的实际工作方式。不过,在这种情况下,对更新操作有更多的控制也是很好的,例如,不需要迭代列表并检查名称,直接让更新操作与层本身的调用连接或返回,这样就可以直接将更新操作与正确的数据流相关联

将tensorflow导入为tf
进口舒蒂尔
将os.path导入为osp
rmtree(osp.join('/tmp',keras_model_testtb'),ignore_errors=True)
tb_saver=tf.summary.FileWriter(osp.join(
“/tmp”、“keras”模型“testtb”,
))
input1=tf.keras.layers.Input(shape=(无,3),dtype=tf.float32)
batchnorm=tf.keras.layers.BatchNormalization()
output1=batchnorm(输入1,训练=tf.常数(真))
#以下印刷品显示:
# [
#   ,
#   
# ]
打印(batchnorm.updates)
input2=tf.keras.layers.Input(shape=(无,3),dtype=tf.float32)
output2=batchnorm(输入2,训练=tf.常数(真))
#以下印刷品显示:
# [
#   ,
#   ,
#   ,
#   
# ]
#两个层调用的更新操作被合并到一个列表中,并且必须检查操作的名称
#在优化器中正确使用它们
打印(batchnorm.updates)
使用tf.Session()作为会话:
session.run(tf.global\u variables\u initializer())
tb\u saver.add\u图形(session.graph)
下面是一些使用Keras模型API的示例代码。如您所见,仅在使用keras输入层的情况下,模型更新操作才具有上一示例中的额外2个更新操作。对于数据集迭代器,它似乎做了一些不同的事情

#/usr/bin/env蟒蛇3
导入tensorflow作为tf
进口舒蒂尔
将os.path导入为osp
def重塑(示例):
返回tf.cast(tf.tile(示例[None,None,None],[2,4,3]),tf.float32)
ds=tf.data.Dataset.range(10)
ds=ds.map(重塑)
input_ds=ds.make_one_shot_iterator().get_next()
rmtree(osp.join('/tmp',keras_model_testtb'),ignore_errors=True)
tb_saver=tf.summary.FileWriter(osp.join(
“/tmp”、“keras”模型“testtb”,
))
input1=tf.keras.layers.Input(shape=(无,3),dtype=tf.float32)
output1=tf.keras.layers.BatchNormalization()(input1,training=tf.constant(True))
模型=tf.keras.models.model(输入=输入1,输出=输出1)
#以下照片显示:
# [
#   ,
#   
# ]
# []
打印(型号更新)
打印([n.name在tf.get_default_graph().中表示n的n.name,如果n.name中的'model'和n.name中的'AssignSubVariableOp',则表示为_graph_def().节点])
输出=模型(输入)
#以下照片显示:
# [
#   ,
#   
# ]
#['model/batch\u normalization\u v1/AssignMovingAvg/AssignSubVariableOp','model/batch\u normalization\u v1/AssignMovingAvg\u 1/AssignSubVariableOp']
打印(型号更新)
打印([n.name在tf.get_default_graph().中表示n的n.name,如果n.name中的'model'和n.name中的'AssignSubVariableOp',则表示为_graph_def().节点])
#如上所述,我希望在model.updates中也能找到新的更新操作,就像在keras输入张量上调用模型一样:
input2=tf.keras.layers.Input(shape=(无,3),dtype=tf.float32)
输出2=模型(输入2)
#以下照片显示:
# [
#   ,
#   ,
#   ,
#   
# ]
# [
#“模型/批次标准化\u v1/AssignMovingAvg/AssignSubVariableOp”、“模型/批次标准化\u v1/AssignMovingAvg\u 1/AssignSubVariableOp”,
#“model_1/batch_normalization_v1/AssignMovingAvg/AssignSubVariableOp”、“model_1/batch_normalization_v1/AssignMovingAvg_1/AssignSubVariableOp”
# ]
打印(型号更新)
打印([n.name在tf.get_default_graph().中表示n的n.name,如果n.name中的'model'和n.name中的'AssignSubVariableOp',则表示为_graph_def().节点])
使用tf.Session()作为会话:
session.run(tf.global\u variables\u initializer())
tb\u saver.add\u图形(session.graph)