学习《简单粗暴TensorFlow2》

编程入门 行业动态 更新时间:2024-10-27 01:35:52

学习《简单<a href=https://www.elefans.com/category/jswz/34/1720115.html style=粗暴TensorFlow2》"/>

学习《简单粗暴TensorFlow2》

学习《简单粗暴TensorFlow2》

官方文档:/zh_hans/basic/basic.html

第一个tensorflow程序

#导入tensorflow模块并为模块起一个别名
import tensorflow as tf
#在此我们就现为它起别名为tf,即TensorFlow的缩写
A = tf.constant([[1,2],[3,4]])
B = tf.constant([[5,6],[7,8]])
C = tf.matmul(A,B)
print(C)

输出

tf.Tensor(
[[19 22][43 50]], shape=(2, 2), dtype=int32)
  • 英文翻译
    constants:常数,常量
    matrix:矩阵
    multiplication:乘法
    可知matmul()函数功能为矩阵相乘
  • 回顾矩阵乘法计算
    定义矩阵 计算矩阵乘积

关于TensorFlow使用张量

TensorFlow使用张量(Tensor)作为数据基本单位
0维数组:标量
1维数组:向量
2维数组:矩阵
多维数组:张量
import tensorflow as tf
#定义一个随机数(标量)
random_float = tf.random.uniform(shape=())
#定义一个有2个元素的零向量
zeros_vector = tf.zeros(shape=(2))
#定义两个2*2的常量矩阵
A = tf.constant([[1.0,2.0],[3.0,4.0]])
B = tf.constant([[5.0,6.0],[7.0,8.0]])
#张量最重要的属性是形状、类型、值。可以通过shape、dtype 属性、与numpy()方法获取
print(A.shape)
print(A.dtype)
print(A.numpy())

输出

(2, 2)
<dtype: 'float32'>
[[1. 2.][3. 4.]]

指定张量内容数据类型

import tensorflow as tf
#在TensorFlow中大多数API都会默认张量的元素类型为tf.float32
#也可以加入dtype参数指定
zero_vector = tf.zeros(shape=(2),dtype=tf.int32)
#tensorflow中的张量的numpy方法是将张量值转为一个NumPy数组返回
print(type(zero_vector.numpy()))

输出

<class 'numpy.ndarray'>
  • TensorFlow中里面有大量的操作,使得我们对张量进行相关计算
import tensorflow as tf
A = tf.constant([[1,2],[3,4]])
B = tf.constant([[1,2],[3,4]])
#计算矩阵 A + B
C = tf.add(A,B)
D = tf.matmul(A,B)
print(C)
print(D)

输出

tf.Tensor(
[[2 4][6 8]], shape=(2, 2), dtype=int32)
tf.Tensor(
[[ 7 10][15 22]], shape=(2, 2), dtype=int32)

TensorFlow2自动求导机制

import tensorflow as tf
#TensorFlow引入了GradientTape() “求导记录器”来实现自动求导
#以 y(x)=x^2 计算在x=3时的导数#定义tensorflow变量
x = tf.Variable(initial_value=3.)#变量x初始值为3
with tf.GradientTape() as tape:#与python3文件对象类似y = tf.square(x)
y_grad = tape.gradient(y,x) #计算y关于x的导数
print(y)
print(y_grad)
#可见在x=3时 关于函数y=x^2  y=9  y关于x的导数 2*x 为6

输出

tf.Tensor(9.0, shape=(), dtype=float32)
tf.Tensor(6.0, shape=(), dtype=float32)

TensorFlow多元函数求偏导数

import tensorflow as tf
#对于多元函数求偏导数,以及对向量或矩阵的求导
x = tf.constant([[1.,2.],[3.,4.]])
y = tf.constant([[1.],[2.]])
w = tf.Variable(initial_value=[[1.],[2.]])
b = tf.Variable(initial_value=1.)
with tf.GradientTape() as tape:L = tf.reduce_sum(tf.square(tf.matmul(x,w) + b -y))
w_grad,b_grad = tape.gradient(L,[w,b])
print(L)
print(w_grad)
print(b_grad)

输出

tf.Tensor(125.0, shape=(), dtype=float32)
tf.Tensor(
[[ 70.][100.]], shape=(2, 1), dtype=float32)
tf.Tensor(30.0, shape=(), dtype=float32)
  • 表达式推导

  • 注意:关于+b的疑问?在numpy中有如下情况

体验线性模型

理论知识回顾

  • 从房价价格回归问题入手线性模型

数据归一化

# 数据归一化
import numpy as np
x_data=[2013,2014,2015,2016,2017]
y_data=[12000,14000,15000,16500,17500]
X_array = np.array(x_data,dtype=np.float32)
Y_array = np.array(y_data,dtype=np.float32)X = (X_array - X_array.min()) / (X_array.max() - X_array.min())
Y = (Y_array - Y_array.min()) / (Y_array.max() - X_array.min())print(X)
print(Y)

输出

[0.   0.25 0.5  0.75 1.  ]
[0.         0.12914057 0.19371085 0.2905663  0.35513657]

numpy中的线性回归

梯度下降不做过多阐述、对此陌生的学习者可以在网络上寻找课程资源进行学习

#numpy中的线性回归
import numpy as np
#数据归一化
x_data=[2013,2014,2015,2016,2017]
y_data=[12000,14000,15000,16500,17500]
X_array = np.array(x_data,dtype=np.float32)
Y_array = np.array(y_data,dtype=np.float32)
X = (X_array - X_array.min()) / (X_array.max() - X_array.min())
Y = (Y_array - Y_array.min()) / (Y_array.max() - X_array.min())
print(X)
print(Y)
#np.dot()求内积 np.sum()求和
a,b = 0,0
num_epoch = 10000#梯度下降迭代次数
learning_rate = 5e-4#学习率
for i in range(num_epoch):y_pred = a * X + bgrad_a,grad_b = 2*(y_pred - Y).dot(X),2 * (y_pred - Y).sum()#更新 a ba,b = a - learning_rate * grad_a,b - learning_rate * grad_b
print(a,b)
#我们可以得到当 a=0.34674477390013597 b=0.020443427665159785
#时损失最小
  • 公式推导


TensorFlow下的线性回归

# 数据归一化
import numpy as np
import tensorflow as tf
x_data=[2013,2014,2015,2016,2017]
y_data=[12000,14000,15000,16500,17500]
X_array = np.array(x_data,dtype=np.float32)
Y_array = np.array(y_data,dtype=np.float32)
X = (X_array - X_array.min()) / (X_array.max() - X_array.min())
Y = (Y_array - Y_array.min()) / (Y_array.max() - X_array.min())
print(X)
print(Y)
"""
在tensorflow中最好的优点就是自动求导机制
使用tape.gradient(y,x)自动计算梯度
使用optimizer.apply_gradients(grads_and_vars)自动更新模型参数
"""
#首先我们像数据集定义为张量进行表达
#将numpy数组转为tensorflow张量
X = tf.constant(X)
Y = tf.constant(Y)
#定义a、b变量
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a,b]
num_epoch = 10000#梯度下降迭代次数
optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)
for i in range(num_epoch):with tf.GradientTape() as tape:y_pred=a * X + bloss = tf.reduce_sum(tf.square(y_pred - Y))# TensorFlow自动计算损失函数关于自变量地梯度grads = tape.gradient(loss,variables)# TensorFlow自动根据梯度更新参数optimizer.apply_gradients(grads_and_vars=zip(grads,variables))
print(a)
print(b)
#可以直到当a=0.34674457 b=0.020443512是loss最小化
  • 翻译
    optimizer(优化器) SGD(stochastic gradient sescent 随机梯度下降)
    learning_rate(学习率)
    Epoch 在深度学习中常定义为:
    使用训练集的全部数据对模型进行一次完整训练,被称之为"一代训练"

输出

[0.   0.25 0.5  0.75 1.  ]
[0.         0.12914057 0.19371085 0.2905663  0.35513657]
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.34674457>
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.020443512>

更多推荐

学习《简单粗暴TensorFlow2》

本文发布于:2024-03-08 06:49:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720111.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:粗暴   简单

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!