TensorFlow通过raw_ops调用底层op计算

tf底层的算子定义在tensorflow-1.15.0\tensorflow\core\ops\ops.pbtxt

raw_ops调用必须采用a = tf.raw_ops.Add(x=x, y=y)的形式,x=不能不写,可以采用下面这种方式解决:

name和data关联可以采用**arges

 inputs = dict(zip(input_names, input_data))
result_tf = tf_op(**inputs, **attr_seting)
 

example 1 简单加法


import tensorflow as tf
import numpy


x = 10
y = 20

a = tf.raw_ops.Add(x=x, y=y)

# Start training
with tf.Session() as sess:

    # Run the initializer
    print(sess.run(a))

注意要使用关键字参数,即形如Add(x=x, y=y),具体的关键字参数是什么,要去算子介绍页面查看,例如tensorflow::ops::Add介绍页。

example 2 调用反向梯度优化op


import tensorflow as tf
import numpy as np


shape = (1,8)

var = tf.Variable(tf.ones(shape=shape),name='var')


alpha = 0.5
delta = tf.Variable(tf.ones(shape=shape),name='delta')


output = tf.raw_ops.ApplyGradientDescent(  var=var,  alpha=alpha,  delta=delta)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # Run the initializer
    print(sess.run(output))
 
    

example 3 调用ApplyMomentum 反向梯度momentum优化op

import tensorflow as tf
import numpy as np


shape = (1,8)
lr = 1.0
momentum = 0.9

var = tf.Variable(tf.ones(shape=shape),name='var')
grad = tf.Variable(tf.ones(shape=shape),name='delta')
accum = tf.Variable(tf.ones(shape=shape),name='delta')

output = tf.raw_ops.ApplyMomentum(
         var=var,
         accum=accum,
         lr=lr,
         grad=grad,
         momentum=momentum)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # Run the initializer
    print(sess.run(output))
    print(sess.run(var))
    print(sess.run(accum))
 
    

另一种简单的方法就是在TensorFlow的python包中找到算子定义包并导入调用,例如:

from tensorflow.python.training.gen_training_ops import apply_proximal_adagrad

example4

import tensorflow as tf
import numpy as np

tf.reset_default_graph()

pld1 = tf.placeholder(dtype="float32", shape=[None, 32])
pld2 = tf.placeholder(dtype="float32", shape=[None, 64])
pld3 = tf.placeholder(dtype="float32", shape=[None, 32])
pld4 = tf.placeholder(dtype="float32", shape=[None, 128])

batch = 1

exp1 = tf.raw_ops.Exp(x=pld1)
exp2 = tf.raw_ops.Exp(x=pld2)
exp3 = tf.raw_ops.Exp(x=pld3)
exp4 = tf.raw_ops.Exp(x=pld4)

values = [
    exp1,
    exp2,
    exp3,
    exp4,
]

input1_np = np.random.randn(*[batch, 32])
input2_np = np.random.randn(*[batch, 64])
input3_np = np.random.randn(*[batch, 32])
input4_np = np.random.randn(*[batch, 128])

feed_dict = dict(zip([pld1, pld2, pld3, pld4, ], [input1_np, input2_np, input3_np, input4_np]))

concat1 = tf.raw_ops.ConcatV2(values=values, axis=-1)

size_splits = tf.constant(
    [32,64,32,128],
    dtype="int32",
)

split1 = tf.raw_ops.SplitV(
    value=concat1, size_splits=size_splits, axis=-1, num_split=4)

with tf.Session() as sess:
    # sess.run(tf.global_variables_initializer())
    print(sess.run(split1, feed_dict=feed_dict))

# dump graph as pb
graph = tf.get_default_graph()
graph_def = graph.as_graph_def()

dump_graph_name = "dump_graph.pb"
with tf.gfile.GFile(dump_graph_name, "wb") as f:
    f.write(graph_def.SerializeToString())

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
要实现 LCD 的休眠和唤醒功能,你可以通过在设备的 `struct dev_pm_ops` 结构中定义相应的回调函数来实现。下面是一个示例代码,展示了如何在 Linux 内核驱动中实现 LCD 的休眠和唤醒操作: ```c #include <linux/module.h> #include <linux/init.h> #include <linux/pm.h> static int lcd_suspend(struct device *dev) { // 执行 LCD 的休眠操作 // ... return 0; } static int lcd_resume(struct device *dev) { // 执行 LCD 的唤醒操作 // ... return 0; } static const struct dev_pm_ops lcd_pm_ops = { .suspend = lcd_suspend, .resume = lcd_resume, }; static int __init lcd_init(void) { // 注册设备驱动 // ... // 设置设备的 pm_ops 回调函数 if (dev_pm_set_driver_ops(dev, &lcd_pm_ops) < 0) { pr_err("Failed to set pm_ops\n"); // 错误处理 // ... return -ENODEV; } // 其他初始化操作 // ... return 0; } static void __exit lcd_exit(void) { // 取消注册设备驱动 // ... } module_init(lcd_init); module_exit(lcd_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("LCD driver"); ``` 在以上代码中,`lcd_suspend()` 函数用于执行 LCD 的休眠操作,`lcd_resume()` 函数用于执行 LCD 的唤醒操作。这两个函数应根据你的具体需求进行实现。然后,通过将这两个函数分别赋值给 `struct dev_pm_ops` 结构的 `suspend` 和 `resume` 成员,将其设置为设备的 pm_ops 回调函数。 在设备驱动的初始化函数 `lcd_init()` 中,你需要注册设备驱动并设置 pm_ops 回调函数。如果设置失败,你可以根据需要进行错误处理。 最后,在设备驱动的退出函数 `lcd_exit()` 中,你可以取消注册设备驱动。 请注意,上述代码仅为示例,你需要根据实际情况进行适当的修改和完善。此外,确保在编译时引入正确的头文件,并根据需要进行其他必要的初始化和清理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luchang-Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值