tf.matmul和tf.multiply

本文详细解析了TensorFlow中的两种乘法运算:tf.matmul()用于实现矩阵乘法,需遵循矩阵乘法规则;tf.multiply()则进行元素级别的点乘,要求两个矩阵形状相同。文章还介绍了tf.matmul()的参数及其优化机制,以及tf.multiply()的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

tf.matmul()矩阵乘法和 tf.multiply()点乘

tf.matmul是矩阵的乘法,即tf.matmul(x,y)中的x和y要满足矩阵的乘法规则,例如x=[2,3],y=[3,2]

tf.multiply是两个矩阵对应的数据相乘,所以两个矩阵的形式必须相同,即tf.multiply(x,y)中x和 y具有相同的格式

例如x = [2,3],y= [2,3]
 

----------------------------------------------------------

tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
Multiplies matrix a by matrix b, producing a * b.

参数说明:a和b两个矩阵必须都是同样数据类型,支持的类型如下:float16, float32, float64, int32, complex64, complex128。

transpose,adjoint为转置和共轭转置,默认不进行转置

如果一个或两个矩阵都包含大量的零,当a_is_sparse 或b_is_sparse 设置为真时,a和b都会被处理为稀疏矩阵,会使用一个更有效率的乘法公式。他们都默认设置为假。这个优化规则只能适用于类型为bfloat16 或 bfloat32 的平面矩阵(等级2的张量)。

name: 操作的名字(可选参数)

tf.multiply(x, y, name=None)
Returns x * y element-wise

这两个相乘的数x和y要有相同的数据类型,不然就会报错
 

将上述代码改写成 TensorFlow 2.x 版本的代码如下: ```python import tensorflow as tf def weight(shape, stddev, wd): initial = tf.random.truncated_normal(shape, stddev=stddev) var = tf.Variable(initial) if wd is not None: weight_decay = tf.multiply(tf.nn.l2_loss(var), wd, name='weight_loss') tf.add_to_collection('losses', weight_decay) return var class MyModel(tf.keras.Model): def __init__(self, in_nodes=784, h1_nodes=100, h2_nodes=100, h3_nodes=50): super(MyModel, self).__init__() self.w1 = weight([in_nodes, h1_nodes], 0.1, 0.005) self.b1 = tf.Variable(tf.zeros([h1_nodes])) self.w2 = weight([h1_nodes, h2_nodes], 0.1, 0.0) self.b2 = tf.Variable(tf.zeros([h2_nodes])) self.w3 = weight([h2_nodes, h3_nodes], 0.1, 0.0) self.b3 = tf.Variable(tf.zeros([h3_nodes])) self.w4 = weight([h3_nodes, 10], 0.1, 0.0) self.b4 = tf.Variable(tf.zeros([10])) def call(self, inputs, prob): x = inputs y_ = tf.cast(inputs, tf.float32) h1 = tf.nn.relu(tf.matmul(x, self.w1) + self.b1) h2 = tf.nn.relu(tf.matmul(h1, self.w2) + self.b2) h2_drop = tf.nn.dropout(h2, rate=prob) h3 = tf.nn.relu(tf.matmul(h2_drop, self.w3) + self.b3) h3_drop = tf.nn.dropout(h3, rate=prob) y = tf.nn.softmax(tf.matmul(h3_drop, self.w4) + self.b4) return y model = MyModel() x = tf.keras.Input(shape=(None, 784)) prob = tf.keras.Input(shape=()) y = model(x, prob) y_ = tf.keras.Input(shape=(None, 10)) # 定义损失函数 cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.math.log(y), reduction_indices=[1])) tf.add_to_collection('losses', cross_entropy) loss = tf.add_n(tf.get_collection('losses')) # 定义优化器 train_step = tf.train.AdamOptimizer(1e-4).minimize(loss) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys, prob: 0.5}) ``` 在 TensorFlow 2.x 中,可以使用 `tf.reduce_mean` `tf.reduce_sum` 函数来计算张量的平均值;使用 `tf.math.log` 函数来计算张量的自然对数。此外,可以使用 `tf.train.AdamOptimizer` 来定义优化器,使用 `model.trainable_variables` 来获取所有可训练的变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值