tensorflow 错误:使用FusedBatchNormV3运算符调用TF_AddGradients时,“"的属性'data_format'的值

5lwkijsr  于 2022-10-29  发布在  其他
关注(0)|答案(8)|浏览(135)

大家好,我很高兴看到FusedBatchNormV3现在包含在backprop中。
不幸的是,当我用包含FusedBatchNormV3运算符的TF_Graph调用TF_AddGradients时,我得到了一个空data_format属性的错误。
这可能是由于在注册FusedBatchNormGradV3时未反映默认值。

系统信息

Windows 10 x64操作系统
无自定义代码
https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-windows-x86_64-2.6.0.zip的二进制
TensorFlow版本2.6.0
C API
在CPU上

sg2wtvxw

sg2wtvxw1#

@harujoh为了加快故障排除过程,请提供一个代码片段来重现此处报告的问题。谢谢!

wbgh16ku

wbgh16ku2#

@sushreebarsa下面是重现该问题的代码片段。
它可以工作,但我通常使用C#,而且我已经15年没有使用C++了,所以请原谅任何小错误。


# include <iostream>

# include <tensorflow/c/c_api.h>

int main() {
	auto g = TF_NewGraph();
	auto s = TF_NewStatus();
	int64_t dims[] = { 1, 1, 1, 1 };

	auto ph_desc = TF_NewOperation(g, "Placeholder", "inputVal");
	TF_SetAttrType(ph_desc, "dtype", TF_FLOAT);
	TF_SetAttrShape(ph_desc, "shape", dims, 4);
	auto ph_op = TF_FinishOperation(ph_desc, s);

	auto gamma_desc = TF_NewOperation(g, "Variable", "bn_gamma");
	TF_SetAttrShape(gamma_desc, "shape", nullptr, 0);
	TF_SetAttrType(gamma_desc, "dtype", TF_FLOAT);
	auto gamma_op = TF_FinishOperation(gamma_desc, s);

	auto beta_desc = TF_NewOperation(g, "Variable", "bn_beta");
	TF_SetAttrShape(beta_desc, "shape", nullptr, 0);
	TF_SetAttrType(beta_desc, "dtype", TF_FLOAT);
	auto beta_op = TF_FinishOperation(beta_desc, s);

	auto moving_mean_desc = TF_NewOperation(g, "Variable", "bn_moving_mean");
	TF_SetAttrShape(moving_mean_desc, "shape", dims, 4);
	TF_SetAttrType(moving_mean_desc, "dtype", TF_FLOAT);
	auto moving_mean_op = TF_FinishOperation(moving_mean_desc, s);

	auto moving_var_desc = TF_NewOperation(g, "Variable", "bn_moving_var");
	TF_SetAttrShape(moving_var_desc, "shape", dims, 4);
	TF_SetAttrType(moving_var_desc, "dtype", TF_FLOAT);
	auto moving_var_op = TF_FinishOperation(moving_var_desc, s);

	auto bn_desc = TF_NewOperation(g, "FusedBatchNormV3", "bn");
	TF_Output output;
	output.oper = ph_op;
	output.index = 0;
	TF_AddInput(bn_desc, output);
	output.oper = gamma_op;
	TF_AddInput(bn_desc, output);
	output.oper = beta_op;
	TF_AddInput(bn_desc, output);
	output.oper = moving_mean_op;
	TF_AddInput(bn_desc, output);
	output.oper = moving_var_op;
	TF_AddInput(bn_desc, output);
	TF_SetAttrFloat(bn_desc, "epsilon", 0.0001);
	TF_SetAttrString(bn_desc, "data_format", "NHWC", 4);
	TF_SetAttrBool(bn_desc, "is_training", 1);
	auto bn_op = TF_FinishOperation(bn_desc, s);

	TF_Output bn;
	bn.oper = bn_op;
	bn.index = 0;
	TF_Output outputs[1] = { bn };

	TF_Output gamma;
	gamma.oper = gamma_op;
	gamma.index = 0;
	TF_Output beta;
	beta.oper = beta_op;
	beta.index = 0;
	TF_Output mean;
	mean.oper = moving_mean_op;
	mean.index = 0;
	TF_Output var;
	var.oper = moving_var_op;
	var.index = 0;
	TF_Output variables[4] = { gamma,beta,mean,var };

	TF_Output grad_outputs[1];

	TF_AddGradients(g,
		outputs, 1,
		variables, 4,
		nullptr, s, grad_outputs);

	auto code = TF_GetCode(s);
	if (code != 0) {
		std::cout << TF_Message(s); //Value for attr 'data_format' of "
	}

	return 0;
}
wtlkbnrh

wtlkbnrh3#

@Saduf2019我刚刚注意到标签的版本是错误的。
它现在是2.5,但包含此FusedBatchNormV3的图形可以在2.6rc0的TF_AddGradients中使用。

jxct1oxe

jxct1oxe4#

@harujoh这段代码在TF 2.5中执行成功了吗?

ffdz8vbo

ffdz8vbo5#

@ymodak否,运行包含带TF_AddGradients的FusedBatchNormV3的图形的能力是自2.6rc0以来的新特性。
在2.5中,这是不可用的,并出现以下错误:“没有为操作定义梯度:融合批次标准V3”。
请参阅此提交中的注解。bf3d89b

bjp0bcyl

bjp0bcyl6#

@ymodak我尝试使用2.6.0,但我得到了同样的错误消息。

6ie5vjzr

6ie5vjzr7#

@ymodak请将版本标签从2.6.0-rc 0更改为2.6.0,因为我已经修改了帖子。

qvtsj1bj

qvtsj1bj8#

2.7.0@ymodak上的相同错误

相关问题