# -*- coding: utf-8 -*-
"""
Created on Mon Feb 6 07:00:26 2023
@author: Dell
"""
import tensorflow as tf
import numpy as np
x = tf.constant(3.0)
y = tf.constant(2.0)
print('标量计算')
print('x + y',x+y)
print('x * y',x*y)
print('x / y',x/y)
print('x ** y',x**y)
x = tf.range(4)
print('x的形状',x.shape)
print('x的长度',len(x))
A = tf.reshape(tf.range(20),(4,5))
print('4*5 矩阵',A)
B = tf.transpose(A)
print('A 的转置矩阵',B)
print('两个矩阵的按元素乘法称为Hadamard积 ,或者圈乘')
print('通过降维求和函数降维')
A = tf.reshape(tf.range(60),(3,4,5))
print(A)
print('对A的第二个维度进行降维处理',tf.reduce_sum(A,axis=1))
print('非降维求和')
A_sum = tf.reduce_sum(A,axis = 1,keepdims=True)
print('对A进行非降维求和',)
print('计算指定维度(axis=1)上的均值',A/A_sum)
print('\ntensorflow 中向量默认是指的列向量,生成的一维张量默认是行向量,但是在进行向量积的计算时候\
,B输入的却是一个行向量,线性代数中矩阵乘法定义的是个列向量,因此会引入歧义,\
需要在实际使用的时候仔细分辨')
A = tf.reshape(tf.range(12),(3,4))
B = tf.range(4)
C = tf.linalg.matvec(A,B)
print(A)
print(B)
print('\n矩阵向量积',C)
SD1 = tf.reduce_sum(tf.tensordot(A,B,axes = 1))
print('\n点乘tf.reduce_sum(tf.tensordot(A,B,axes = 1))',SD1)
SD2 = tf.reduce_sum(A*B)
print('\n点乘tf.reduce_sum(A*B)=',SD2)
A = tf.reshape(tf.range(12),(3,4))
B = tf.reshape(tf.range(20),(4,5))
C = tf.matmul(A,B)
print('\n矩阵向量积(矩阵乘法)tf.matmul(A,B) = ',C)
print('\n使用tensorflow计算向量范数')
Cmod = tf.norm(tf.range(12,dtype=float))
print('\n范数只接受浮点数向量,tf.norm(C)=',Cmod)
print('int型张量报错,Value for attr "T "of int32 is not in the list of allowed values: bfloat16, half, float, double, complex64, complex128')
print('\n使用numpy计算矩阵范数')
Aarray = np.ones((4,9))
print(Aarray)
Anorm = np.linalg.norm(Aarray)
print('矩阵佛罗奔尼斯范数np.linalg.norm(Aarray) = ',Anorm)
标量计算
x + y tf.Tensor(5.0, shape=(), dtype=float32)
x * y tf.Tensor(6.0, shape=(), dtype=float32)
x / y tf.Tensor(1.5, shape=(), dtype=float32)
x ** y tf.Tensor(9.0, shape=(), dtype=float32)
x的形状 (4,)
x的长度 4
4*5 矩阵 tf.Tensor(
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]], shape=(4, 5), dtype=int32)
A 的转置矩阵 tf.Tensor(
[[ 0 5 10 15]
[ 1 6 11 16]
[ 2 7 12 17]
[ 3 8 13 18]
[ 4 9 14 19]], shape=(5, 4), dtype=int32)
两个矩阵的按元素乘法称为Hadamard积 ,或者圈乘
通过降维求和函数降维
tf.Tensor(
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[20 21 22 23 24]
[25 26 27 28 29]
[30 31 32 33 34]
[35 36 37 38 39]]
[[40 41 42 43 44]
[45 46 47 48 49]
[50 51 52 53 54]
[55 56 57 58 59]]], shape=(3, 4, 5), dtype=int32)
对A的第二个维度进行降维处理 tf.Tensor(
[[ 30 34 38 42 46]
[110 114 118 122 126]
[190 194 198 202 206]], shape=(3, 5), dtype=int32)
非降维求和
对A进行非降维求和
计算指定维度(axis=1)上的均值 tf.Tensor(
[[[0. 0.02941176 0.05263158 0.07142857 0.08695652]
[0.16666667 0.17647059 0.18421053 0.19047619 0.19565217]
[0.33333333 0.32352941 0.31578947 0.30952381 0.30434783]
[0.5 0.47058824 0.44736842 0.42857143 0.41304348]]
[[0.18181818 0.18421053 0.18644068 0.18852459 0.19047619]
[0.22727273 0.22807018 0.22881356 0.2295082 0.23015873]
[0.27272727 0.27192982 0.27118644 0.2704918 0.26984127]
[0.31818182 0.31578947 0.31355932 0.31147541 0.30952381]]
[[0.21052632 0.21134021 0.21212121 0.21287129 0.21359223]
[0.23684211 0.2371134 0.23737374 0.23762376 0.23786408]
[0.26315789 0.2628866 0.26262626 0.26237624 0.26213592]
[0.28947368 0.28865979 0.28787879 0.28712871 0.28640777]]], shape=(3, 4, 5), dtype=float64)
tensorflow 中向量默认是指的列向量,生成的一维张量默认是行向量,但是在进行向量积的计算时候 ,B输入的却是一个行向量,线性代数中矩阵乘法定义的是个列向量,因此会引入歧义, 需要在实际使用的时候仔细分辨
tf.Tensor(
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]], shape=(3, 4), dtype=int32)
tf.Tensor([0 1 2 3], shape=(4,), dtype=int32)
矩阵向量积 tf.Tensor([14 38 62], shape=(3,), dtype=int32)
点乘tf.reduce_sum(tf.tensordot(A,B,axes = 1)) tf.Tensor(114, shape=(), dtype=int32)
点乘tf.reduce_sum(A*B)= tf.Tensor(114, shape=(), dtype=int32)
矩阵向量积(矩阵乘法)tf.matmul(A,B) = tf.Tensor(
[[ 70 76 82 88 94]
[190 212 234 256 278]
[310 348 386 424 462]], shape=(3, 5), dtype=int32)
使用tensorflow计算向量范数
范数只接受浮点数向量,tf.norm(C)= tf.Tensor(22.494444, shape=(), dtype=float32)
int型张量报错,Value for attr "T "of int32 is not in the list of allowed values: bfloat16, half, float, double, complex64, complex128
使用numpy计算矩阵范数
[[1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1.]]
矩阵佛罗奔尼斯范数np.linalg.norm(Aarray) = 6.0