TensorFlow2.0基础学习笔记

创建张量

import tensorflow as tf

print("Tensorflow version:", tf.__version__)  # 检查版本号
print("Eager execution is:", tf.executing_eagerly())  # 检查是否在Eager模式下

'''
Tensor表示张量,其实就是多维数组。
'''
'''
python中的列表list
Numpy中的数组对象ndarray
TensorFlow中的张量(Tensor)
'''
# 区别
'''
python列表(list):
    ·元素可以使用不同的数据类型,可以嵌套
    ·在内存中不连续存放,是一个动态的指针数组
    ·读写效率低,占用内存空间大
    ·不适合做数值计算
    
Numpy数组(ndarray):
    ·元素数据类型相同
    ·每个元素在内存中占用的空间相同
    存储在一个连续的内存区域内
    ·存储空间小,读取和写入速度快
    ·在cpu中运算,不能够主动检测利用gpu进行运算
TensorFlow张量(Tensor):
    ·可以高速运行于gpu和Tpu之上
    ·支持cpu、嵌入式、单机多卡和多机多卡等多种计算环境
    ·高速的实现神经网络和深度学习中的复杂算法
'''
# 创建Tensor对象
    # tf.constant()函数:创建张量
    # tf.constant(value,dtype,shape)
        # value:数字\python列表\numpy数组
        # dtype:元素的数据类型
        # shape:张量的形状
    # tf.convert_to_tensor()函数
'''
    判断是否是张量:
        is_tensor()函数
        isinstance()函数
'''
# 参数为PYthon列表
import tensorflow as tf
print(tf.constant([[1,2],[3,4]]))
# 张量的.numpy()方法
a = tf.constant([[1,2],[3,4]])
print(a.numpy())
print(type(a))
# <class 'tensorflow.python.framework.ops.EagerTensor'>表示其是eager模式下的张量
# 创建张量(tensor)
'''
tf.constant(张量内容,dtype=数据类型)
'''
import tensorflow as tf

a = tf.constant([1, 5], dtype=tf.int64)
print(a)
print(a.dtype)  # 数据类型
print(a.shape)  #
# tf.Tensor([1 5], shape=(2,), dtype=int64) 打印出张量的所有内容
# <dtype: 'int64'>  数据类型
# (2,)  2表示有两个元素,一个逗号隔开表示一维数组

# convert 转换

'''
将numpy的数据类型转换为Tensor的数据类型
tf.convert_to_tensor(数据名,dtype=数据类型(可选))

'''
import tensorflow as tf
import numpy as np

a = np.arange(0, 5)
b = tf.convert_to_tensor(a, dtype=tf.int64)
print(a)
print(b)
# [0 1 2 3 4]
# tf.Tensor([0 1 2 3 4], shape=(5,), dtype=int64)

'''
创建全为0的张量
tf.zeros(维度)

创建全为1的张量
tf.ones(维度)

创建全为指定值的张量
tf.fill(维度,指定值)

维度:
    一维 直接写个数
    二维  用[行,列]
    多维 用[n,m,j,k.....]
    
'''
print("******************")
a = tf.zeros([2, 3])  # 二维数组
b = tf.ones(4)  # 一维数组
c = tf.fill([2, 2], 9)  # 二维数组
print(a)
print(b)
print(c)


'''
生成正态分布的随机数,默认均值为0,标准差为1
tf.random.normal(维度,mean=均值,stddev=标准差)

生成截断式正态分布的随机数(truncated 截断)
tf.random.truncated_normal(维度,mean=均值,stddev=标准差)

在tf.truncated_normal中如果随机生成数据的取值在()

'''
d = tf.random.normal([2,2],mean=0.5,stddev=1)
print(d)

e = tf.random.truncated_normal([2,2],mean=0.5,stddev=1)
print(e)
# tf.Tensor(
# [[ 0.8248359  0.9195403]
#  [-0.9171852  0.9591876]], shape=(2, 2), dtype=float32)
# tf.Tensor(
# [[-1.4231092   0.9822493 ]
#  [ 0.93558526  1.1987464 ]], shape=(2, 2), dtype=float32)

'''
生成均匀分布随机数
tf.random.uniform(维度,minval=最小值,max=最大值)

'''
f = tf.random.uniform([2,2],minval=0,maxval=1)
print(f)
# tf.Tensor(
# [[0.4069723  0.3565172 ]
#  [0.7605829  0.19685042]], shape=(2, 2), dtype=float32)

'''
常用函数
强制tensor转换为该数据类型(用tf.cast强制类型转换)
tf.cast(张量名,dtype=数据类型)

计算张量维度上的最小值
tf.reduce_min(张量名)

计算张量维度上元素的最大值
tf.reduce_max(张量名)

'''
x1 = tf.constant([1.,2.,3.],dtype = tf.float64)
print(x1)

x2 = tf.cast(x1,tf.int32)
print(x2)

print(tf.reduce_min(x2))
print(tf.reduce_max(x2))
# tf.Tensor([1. 2. 3.], shape=(3,), dtype=float64)
# tf.Tensor([1 2 3], shape=(3,), dtype=int32)
# tf.Tensor(1, shape=(), dtype=int32)
# tf.Tensor(3, shape=(), dtype=int32)

'''
axis
在一个二维张量或数组中,可以通过调整axis等于0或1控制执行维度

axsi=0代表跨行(经度,down),而axis=1代表跨列(维度,across)
如果不指定axis,则所有元素参与计算

计算张量沿着指定维度的平均值
tf.reduce_mean(张量名,axis=操作轴)

计算张量沿着指定维度的和
tf,reduce_sum(张量名,axis=操作轴)

'''
x = tf.constant([[1,2,3],
                 [2,3,4]])
print(x)
print(tf.reduce_mean(x))
print(tf.reduce_sum(x,axis=1))

# tf.Tensor(
# [[1 2 3]
#  [2 3 4]], shape=(2, 3), dtype=int32)
# tf.Tensor(2, shape=(), dtype=int32)
# tf.Tensor([6 9], shape=(2,), dtype=int32)

'''
tf.Variable
tf.Variable()将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。
神经网络训练中,常用该函数标记待训练的变量

tf.Variable(初始值)
'''
#w = tf.Variable(tf.random.normal([2,2],mean=0,stddev=1))

'''
tensorflow中的数学运算

对应元素的四则运算:tf.add,tf.subtract,tf.multiply,tf.divide
平方、次方与开方:tf.square,tf.pow,tf.aqrt
矩阵乘:tf.matmul

实现两个张量的对应元素相加
tf.add(张量1,张量2)
实现两个元素的对应元素相减
tf.subtract(张量1,张量2)
实现两个张量的对应元素相乘
tf.multiply(张量1,张量2)
实现两个张量的对应元素相除
tf.divide(张量1,张量2)

!!!只有维度相同的张量才可以做四则运算

'''
a = tf.ones([1,3])
b = tf.fill([1,3],3.)

print(a)
print(b)

print(tf.add(a,b))
print(tf.subtract(a,b))
print(tf.multiply(a,b))
print(tf.divide(b,a))
print("--------------------")

# tf.Tensor([[1. 1. 1.]], shape=(1, 3), dtype=float32)
# tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32)
# tf.Tensor([[4. 4. 4.]], shape=(1, 3), dtype=float32)
# tf.Tensor([[-2. -2. -2.]], shape=(1, 3), dtype=float32)
# tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32)
# tf.Tensor([[3. 3. 3.]], shape=(1, 3), dtype=float32)
'''
计算某个张量的平方
tf.square(张量名)

计算某个张量的n次方
tf.pow(张量名,n次方数)

计算某个张量的开方
tf.sqrt(张量名)
'''
a = tf.fill([1,2],3.)
print(a)
print(tf.pow(a,3))
print(tf.square(a))
print(tf.sqrt(a))
# tf.Tensor([[3. 3.]], shape=(1, 2), dtype=float32)
# tf.Tensor([[27. 27.]], shape=(1, 2), dtype=float32)
# tf.Tensor([[9. 9.]], shape=(1, 2), dtype=float32)
# tf.Tensor([[1.7320508 1.7320508]], shape=(1, 2), dtype=float32)
'''
矩阵乘tf.matmul

实现两个矩阵的相乘
tf.matmul(矩阵1,矩阵2)
'''
a = tf.ones([3,2])
b = tf.fill([2,3],3.)
print(tf.matmul(a,b))
# tf.Tensor(
# [[6. 6. 6.]
#  [6. 6. 6.]
#  [6. 6. 6.]], shape=(3, 3), dtype=float32)
'''
常用函数 tf.Dataset.from_tensor_slices

切分传入张量的第一维度,生成输入特征标签对,构建数据集
data = tf.Dataset.from_tensor_slices((输入特征,标签))

(Numpy和Tensor格式都可用该语句读入数据)
'''
features = tf.constant([12,23,10,17])
labels = tf.constant([0,1,1,0])
dataset = tf.data.Dataset.from_tensor_slices((features,labels))
for element in dataset:
    print(element)
# (<tf.Tensor: shape=(), dtype=int32, numpy=12>, <tf.Tensor: shape=(), dtype=int32, numpy=0>)
# (<tf.Tensor: shape=(), dtype=int32, numpy=23>, <tf.Tensor: shape=(), dtype=int32, numpy=1>)
# (<tf.Tensor: shape=(), dtype=int32, numpy=10>, <tf.Tensor: shape=(), dtype=int32, numpy=1>)
# (<tf.Tensor: shape=(), dtype=int32, numpy=17>, <tf.Tensor: shape=(), dtype=i
'''
tf.GradientTape 实现对指定参数的求导运算
with结构记录计算过程,gradient求出张量的梯度

with tf.GradientTape() as tape:
    若干个计算过程
grad = tape.gradient(函数,对谁求导)

'''
with tf.GradientTape() as tape:
    w = tf.Variable(tf.constant(3.0))
    loss = tf.pow(w,2)
grad =tape.gradient(loss,w)
print(grad)
# tf.Tensor(6.0, shape=(), dtype=float32)

'''
enumerate是python的内建函数,他可遍历每个元素(如:列表,元组,或字符串)
enumerate(列表名)

'''
seq = ['one','two','three']
for i,element in enumerate(seq):
    print(i,element)
# 0 one
# 1 two
# 2 three
'''
tf.one_hot
tf.one_hot() 函数将待转换数据,转换为one_hot的形式输出。

tf.one_hot(带转换数据,depth=分类)

'''
classes = 3
labels = tf.constant([1,0,2])# 输入的元素值最小为0,最大为2
output = tf.one_hot(labels,depth=classes)
print(output)
# tf.Tensor(
# [[0. 1. 0.]
#  [1. 0. 0.]
#  [0. 0. 1.]], shape=(3, 3), dtype=float32)

创建数组 数组运算

# 生成ndarray(多维数组)的方法
# 1、将列表转换成ndarray
import numpy as np
list1 = [3.14,2.17,0,1,2]
nd1 = np.array(list1)
print(nd1)
print(type(nd1))
# 2、嵌套列表转成多维数组
import numpy as np
list2 = [[3.14,2.17,0,1,2],[1,2,3,4,5]]
nd2 = np.array(list2)
print(nd2)
print(type(nd2))
# 3、利用random模块生成多维数组
'''random 模块里的函数:
        random(生成0~1之间的随机数)
        uniform(生成均匀分布随机数)
        rando(生成标准正态的随机数)
        normal (生成正态分布)
        shuffle(随机打乱顺序)
        seed (设置随机数种子)
        '''
import numpy as np
nd3 = np.random.random([3,3])   # 生成三行三列的0~1之间的随机数
print(nd3)
print(type(nd3))


print('**************************')
# 生成一个随机种子,对生成的随机数打乱
import numpy as np
np.random.seed(123)   # 设置随机数种子序号123 给数列管理器序号123得到哟个数列
nd5_1 = np.random.randn(2,3)        # 生成两行三列得的随机种子
print(nd5_1)
np.random.shuffle(nd5_1)
print("随机打乱后的数据:",nd5_1)
print(type(nd5_1))

# 创建特定形状的多维数组
'''
np.zeros
np.ones
np.diag
np.eye
'''
import numpy as np
# 生成全是0的3x3的矩阵
nd6 = np.zeros([3,3])
# 生成全是1的3x3的矩阵
nd7 = np.ones([3,3])
# 生成3阶单位矩阵
nd8 = np.eye(3)
# 生成3阶对角矩阵
nd9 = np.diag([1,2,3])
print(nd9)

# 利用arange函数生成ndarray
import numpy as np
print(np.arange(10))
print(np.arange(1,10))
print(np.arange(1,4,0.5))
print(np.arange(9,-1,-1))


# 创建数组并且改变数组形状
'''
np.reshape(shape) 不改变当前数组形状,按照shape创建新的数组
np.resize(shape) 改变当前数组,按照shape创建数组
'''

import numpy as np

b = np.arange(12)
print(b.reshape(3, 4))
print(b)
# b = np.arange(12).reshape(3,4)


t = np.arange(24).reshape(2, 3, 4)
print(t)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

# np.reshape(shape) shape = -1 根据数组中的元素个数、以及其他维度的取值,来自动
# 出这个维度的取值
print(b.reshape(-1, 1))
# [[ 0]
#  [ 1]
#  [ 2]
#  [ 3]
#  [ 4]
#  [ 5]
#  [ 6]
#  [ 7]
#  [ 8]
#  [ 9]
#  [10]
#  [11]]

# 一维数组跟多维数组相加,可以将一维数组扩展至多维数组
a = np.array([0, 1, 2, 3])
b = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
print(a + b)
# [[ 0  2  4  6]
#  [ 4  6  8 10]
#  [ 8 10 12 14]]
# 当两个数组中的数据类型不同时,精度低的数据类型会自动转换为精度高的数据类型,然后进行计算

# 矩阵转置:np.transpose()
# 矩阵求逆:np.linalg.inv()
'''
总结:numpy对数组的常用操作
        对数组元素的切片
        改变数组的形状
        数组之间的常用运算
        
'''
# 数组元素的运算
'''
numpy.sum() 计算所有元素的和
numpy.prod() 计算所有元素的乘积
numpy.diff() 计算数组的相邻元素之间的差
np.sqrt() 计算各元素的平方根
np.exp() 计算各元素的指数值
np.abs() 取各元素的绝对值
'''
# 求和函数sum():对数组中的所有元素求和

a = np.arange(4)
print(a)
print(np.sum(a))

b = np.arange(12).reshape(3, 4)
print(b)
print(np.sum(b))
# 6
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
# 66

'''
轴(axes):数组中的每个维度被称为一个轴
秩(rank):轴的格式
'''
print(np.sum(b, axis=0))
# [12 15 18 21]

print(np.sum(b, axis=1))
# [ 6 22 38]

# sqrt() 函数 求平方根
d = np.logspace(1, 4, 4, base=2)  # logspace函数生成等比数列
print(d)
print(np.sqrt(d))
# [ 2.  4.  8. 16.]
# [1.41421356 2.         2.82842712 4.        ]
'''
数组的堆叠运算
np.stack(数组1,数组2,....axis)
'''
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

print(np.stack((x, y), axis=0))
print(np.stack((x, y), axis=1))
# [[1 2 3]
#  [4 5 6]]
# [[1 4]
#  [2 5]
#  [3 6]]


创建矩阵 矩阵运算

'''
创建矩阵
矩阵---numpy.matrix
matrix(字符串/列表/元组/数组)
mat(字符串/列表/元组/数组)
'''
a = np.mat('1 2 3; 4 5 6')
print(a)
b = np.mat([[1,2,3],[4,5,6]])
print(b)

# [[1 2 3]

#  [4 5 6]]

# [[1 2 3]

#  [4 5 6]]

a = np.array([[1,2,3],[4,5,6]])
print(a)
m = np.mat(a)
print(m)

print(type(a))
print(type(m))

# [[1 2 3]

#  [4 5 6]]

# [[1 2 3]

#  [4 5 6]]

# <class 'numpy.ndarray'>

# <class 'numpy.matrix'>

'''
矩阵对象的属性:
    .ndim 矩阵的维数
    .shape 矩阵的形状
    .size 矩阵的元个数
    .dtype 元素的数据类型
'''
print(m.ndim)
print(m.shape)
print(m.size)
print(m.dtype)

# 2

# (2, 3)

# 6

# int32

'''矩阵运算
矩阵的转置:.T
矩阵求逆:.I
'''
n = np.mat([[1,2],[-1,-3]])
print(n)
print(n.T)
print(n.I)

# [[ 1  2]

#  [-1 -3]]

# [[ 1 -1]

#  [ 2 -3]]

# [[ 3.  2.]

#  [-1. -1.]]

# 随机数

'''
随机数模块---numpy.random
np.random.rand()    元素在[0,1)之间均匀分布的数组
np.random.uniform(low,hige,size)    元素在[low,hige)区间均匀分布的数组
np.random.randn(d0,d1,d2,...,dn)    产生标准正态分布的数组(标准差时1,均值时0的正态分布)
np.random.normal(loc,scale,size)    产生正态分布的数组loc 均值;scale标准差

伪随机数:由随机种子,根据一定的算法生成的
随机种子:指定随机数生成时所用算法开始的整数值
    如果使用相同的seed()值,则每次生成的随机数都是相同的
    如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同
    
'''

# 打乱顺序的函数 np.random.shuffle(序列)

# 多维数组只打乱第一维

b = np.arange(12).reshape(4,3)
print(b)
c = np.random.shuffle(b)
print(c)

数字图像基本概念

一个字节由8个二进制位组成
图像压缩:适当降低图像质量来减小它所占用的空间
         不同的图像压缩算法,对应不同的图像格式

像素(Pixel):是图像中的一个最小单位

图像的离散化:
    连续图像:人眼直接感受到的图像
    数字图像:把连续的图像数字化、离散化之后的图像。它是对连续图像的一种近似

色彩深度/位深度:位图中每个像素点要用多少二进制位来表示

位图(bitmap):
    通过记录每一个像素的颜色值,来存储和表达图像

    图像格式:
        BMP格式(是windows系统的标准位图格式):需要保存每个像素的颜色信息,占用存储空间大,不支持文件压缩,不适用网页

        JPEG:有损压缩
              压缩率高,所占空间小
              适合于色彩丰富、细节清晰细腻的大图像
              不适合所含颜色较少,具有大块颜色相近的区域,或亮度差异十分明显的简单图片
              每次编辑都会降低图像质量,不适合需要进行多次编辑的情况
        PNG(Portable Network Graphics ,PNG):无损压缩
                                             适合于有规律渐变色彩的图像

        ,GIF,TIFF
    色彩模式:记录图像颜色的方式
        二值图像(Binary Image):每个像素只有2种可能的取值,使用1位二进制来表示,位深度为 0代表黑色,1代表白色

        灰度图像(Gray Image):每个像素使用1个字节表示,位深度位8,可以表示256种级别的灰度。0表示黑色,255表示白色
        RGB图像(彩色图像):每个像素都有红(R)、绿(G)、蓝(B)三个分量(称为通道)
                         1个像素点使用3个字节(每个分量1个字节),位深度为24位(3*8)
                         可以表示256*256*256种颜色
                         称为24位真彩色
        RGBA图像:RGB图像+8位透明度信息Alpha(称为Alpha通道或者A通道)
                 32位真彩色图像:1个像素点使用4个字节,位深度为32256色彩色图像:每个像素用8位二进制表示,是调色板中的索引值
        CMYK、
        YCbCr、
        HSI

python图像处理库

import PIL.Image
from PIL import Image
import matplotlib.pyplot as plt

img = Image.open('lena.tiff')
img.save('test.tiff')
img.save('lena.jpg')
img.save('lena.bmp')

img1 = Image.open('lena.tiff')
img2 = Image.open('lena.bmp')
img3 = Image.open('lena.jpg')

print("image1:", img1.format)
print("image2:", img2.format)
print("image3:", img3.format)

print("size:", img1.size)
print("size:", img2.size)
print("size:", img3.size)

print("mode:", img1.mode)
print("mode2:", img2.mode)
print("mode3:", img3.mode)

# imshow() 函数负责对图像进行处理 并显示其格式
plt.figure(figsize=(5, 5))
plt.imshow(img)
plt.show()

# 分别显示不同格式的图像
# 设置画布尺寸

img1 = Image.open('lena.tiff')
img2 = Image.open('lena.bmp')
img3 = Image.open('lena.jpg')

plt.figure(figsize=(15, 5))

# 将画布划分为1行3列
plt.subplot(131)
# 不显示坐标轴
plt.axis("off")
# 显示img图像(对图像进行处理并显示其格式)
plt.imshow(img1)
# 子图标题位置显示子图格式
plt.title(img1.format)

plt.subplot(132)
plt.axis("off")
plt.imshow(img2)
plt.title(img2.format)

plt.subplot(133)
plt.axis("off")
plt.imshow(img3)
plt.title(img3.format)

plt.show()

# 转换图像的色彩模式
# 图像对像.convert(色彩模式)
img_gray = img.convert("L")  # 将图像转换成灰度图像
print("mode=", img_gray.mode)  # 输出图像模式

plt.figure(figsize=(5, 5))
plt.imshow(img_gray)
plt.show()

# 将转换的灰度图像保存在工作目录
img_gray.save("lena_gray.bmp")

# 颜色通道的分离与合并
'''
分离:图像对象.split()
合并:Image.merge(色彩模式,图像列表)
'''
# 打开RGB图像
img = Image.open("lena.tiff")
# 使用.split()分为三个颜色通道分别存储在不同的对象中
img_r, img_g, img_b = img.split()

plt.figure(figsize=(10, 10))

plt.subplot(221)
plt.axis('off')
# cmap=gray表示各个通道的图像是以灰度图像的形式显示的
plt.imshow(img_r, cmap="gray")
plt.title("R", fontsize=20)

plt.subplot(222)
plt.axis("off")
plt.imshow(img_b, cmap="gray")
plt.title("G", fontsize=20)

plt.subplot(223)
plt.axis("off")
plt.imshow(img_g, cmap="gray")
plt.title("B", fontsize=20)

# 使用Image.merage(色彩模式,图像列表)合并各颜色通道,得到RGB彩色图像并显示在子图中
img_rgb = Image.merge("RGB", [img_r, img_g, img_b])
plt.subplot(224)
plt.axis("off")
plt.imshow(img_rgb)
plt.title("RGB", fontsize=20)

plt.show()

# 转化为数组
'''
np.array()

'''
import numpy as np

arr_img = np.array(img)
print("shape:", arr_img.shape, "\n")
print(arr_img)

# 将灰度图像lena_gray.bmp转化为数组
img_gray = Image.open("lena.bmp")
arr_img_gray = np.array(img_gray)
print("\nshape:", arr_img_gray.shape)
print(arr_img_gray)

# 255-arr_img_gray反向
arr_img_new = 255 - arr_img_gray
plt.figure(figsize=(10, 5))

plt.subplot(121)
plt.axis("off")
plt.imshow(arr_img_gray, cmap="gray")

plt.subplot(122)
plt.axis("off")
plt.imshow(arr_img_new, cmap="gray")

plt.show()

# 对图像的缩放、旋转和镜像
# 缩放图像
# 图像对像.resize((width,height))
# 图像对象.thumbnail((width,height))
plt.figure(figsize=(5, 5))
img_small = img.resize((64, 64))

plt.imshow(img_small)
plt.show()
img_small.save("lena_s.jpg")

# 旋转、镜像
# 图像对象.trandpose(旋转方式)
import matplotlib.pyplot as plt
from PIL import Image

plt.rcParams["font.sans-serif"] = "Simhei"
img = Image.open("lena.tiff")

plt.figure(figsize=(10, 10))

# 划分子图区域,并显示图像
plt.subplot(221)
plt.axis("off")
plt.imshow(img)
plt.title("原图", fontsize=20)

plt.subplot(222)
plt.axis("off")
img_flr = img.transpose(Image.FLIP_LEFT_RIGHT)
plt.imshow(img_flr)
plt.title("左右翻转:", fontsize=20)

plt.subplot(223)
plt.axis("off")
img_flr = img.transpose(Image.ROTATE_90)
plt.imshow(img_flr)
plt.title("逆时针旋转90度:", fontsize=20)

plt.subplot(224)
plt.axis("off")
img_flr = img.transpose(Image.TRANSPOSE)
plt.imshow(img_flr)
plt.title("转置:", fontsize=20)

plt.show()

# 裁剪
# .crop()
import matplotlib.pyplot as plt
from PIL import Image

img = Image.open("lena.tiff")

plt.figure(figsize=(10, 5))

plt.subplot(121)  # 绘制子图区域
plt.imshow(img)  # 显示原图

plt.subplot(122)
img_region=img.crop((100,100,600,500))
plt.imshow(img_region)

plt.show()

Matplotlib

# import matplotlib.pyplot as plt

'''
Figure 对象
    figure(num,figsize,dpi,facecolor,edgecolor,frameon)
    

    num:图形编号或名称(数字/字符串)
    figsize:绘图对象的宽和高,单位为英寸
    dpi:绘图对象的分辨率,缺省值为80
    facecolor:背景颜色
    edgecolor:边框颜色
    frameon:是否显示边框 

Figure 对象---划分子图  
    subplot(行数,列数,子图序号)
'''

# import matplotlib.pyplot as plt

#

# plt.figure(figsize=(3,2),facecolor='green')

# plt.plot()  # plot() 绘制空白图形

# plt.show()  # 显示出来

#

# import matplotlib.pyplot as plt

# fig = plt.figure()

# plt.subplot(221)

# plt.subplot(222)

# plt.subplot(223)

# plt.show()

'''
设置中文字体
plt.rcParams["font.sans-serif"] = "SimHei"
    rcParams:run configuration Params即运行配置参数
    ["font.sans-serif"] :字体
    "SimHei":中文黑体
添加标题
    添加全局标题
        suptitle(标题文字)
    添加子标题
        title(标题文字)
        
tight_layout()函数 调整间隔
    检查坐标轴标签、刻度标签、子图标题,自动调整子图,使之自动填充整个绘图区域
    并消除子图之间的重叠
    tight_layout(rect=[left,bottom,right,top])
    
'''
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = "SimHei"

fig = plt.figure(facecolor="lightgrey")

plt.subplot(221)
plt.title('子标题1')
plt.subplot(222)
plt.title('子标题2', loc='left', color='b')
plt.subplot(223)
myfontdict = {'fontsize': 12, 'color': 'g', 'rotation': 30}
plt.title('子标题3', fontdict=myfontdict)
plt.subplot(224)
plt.title('子标题4', color='white', backgroundcolor='black')

plt.suptitle('全局标题', fontsize=20, color='red', backgroundcolor='yellow')
plt.tight_layout(rect=[0, 0, 1, 0.9])  # 自动调整间隔使子图充满整个画布
plt.show()

# 散点图的绘制(scatter):数据点在直角坐标系中的分布图

'''
scatter(x,y,scale,color,marker,label)
text(x,y,s,fontsize,color)

增加均匀分布的点
增加图例 在scatter函数中的label属性中添加图例内容即可
        legend(loc,fontsize)显示图例 loc图例显示位置 fontsize字的大小
'''
import matplotlib.pyplot as plt  # 导入绘图库
import numpy as np  # 导入numpy库

plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文黑体为默认字体
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

n = 1024  # 随机点个数
x1 = np.random.normal(0, 1, n)  # 生成数据点x坐标
y1 = np.random.normal(0, 1, n)  # 生成数据点y坐标
x2 = np.random.uniform(-4, 4, (1, n))
y2 = np.random.uniform(-4, 4, (1, n))

plt.scatter(x1, y1, color='blue', marker='*', label='正态分布')  # 绘制数据点
plt.scatter(x2, y2, color='yellow', marker='o', label='均匀分布')

plt.legend()  # legend() 函数显示字体
plt.title('标准正态分布', fontsize=20)  # 设置标题

# plt.text(2.5, 2.5, '均 值:0\n标准差:1')  # 显示文本

plt.xlim(-4, 4)  # x轴范围
plt.ylim(-4, 4)  # y轴范围

plt.xlabel('横坐标x', fontsize=14)  # 设置x轴标签文本
plt.ylabel('纵坐标y', fontsize=14)  # 设置y轴标签文本

plt.show()  # 显示绘图

# 绘制折线图(在散点图的基础上将相邻的点用线段连接起来

'''
plot 绘制
plot(x,y,color,marker,label,linewidth,markersize)函数 绘制折线图
'''
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = 'SimHei'  # 转成在中文字体

n = 24  # 生成24个点
y1 = np.random.randint(27, 37, n)  # 生成随机数列
y2 = np.random.randint(40, 60, n)  # 生成随机数列

plt.plot(y1, label='温度')  # 绘制折线图   将上面产生的随机数作为y坐标
plt.plot(y2, label='湿度')  # 绘制折线图   将上面产生的随机数作为y坐标

plt.xlim(0, 23)  # 设置坐标轴范围
plt.ylim(20, 70)  # 设置坐标轴范围
plt.xlabel('小时', fontsize=12)
plt.ylabel('测量值', fontsize=12)

plt.title('24小时温度湿度统计')  # 设置标题

plt.legend()
plt.show()

# 绘制柱形图

'''
使用bar函数绘制柱形图
bar(left,height,width,facecolor,edgecolor,label)
facecolor 填充色
edgecolor 边缘颜色
'''
import numpy as np
import matplotlib.pyplot as plt  # 导入库

plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False  # 设置rc参数

y1 = [32, 25, 16, 30, 24, 45, 40, 33, 28, 17, 24, 20]
y2 = [-23, -35, -26, -35, -45, -43, -35, -32, -23, -17, -22, -28]

plt.bar(range(len(y1)), y1, width=0.8, facecolor='green', edgecolor='white', label='统计量1')  # 绘制柱形条纹
plt.bar(range(len(y2)), y2, width=0.8, facecolor='red', edgecolor='white', label='统计量2')

plt.title("柱状图", fontsize=20)  # 显示标题

plt.legend()  # 显示图例
plt.show()  # 显示整个绘图

'''
matplotlib官网有图和源程序
'''

鸢尾花数据集 手写图像minist数据集

鸢尾花数据集

# 鸢尾花数数据集
# 下载数据集(鸢尾花数据集不是tensorflow和keras中集成的内部数据集)
'''
get_file() 函数————下载数据集

csv文件是一种字符分割的文件,以纯文本的形式存储表格数据可以使用记事本打开也可以

在指定网络中下载数据集用:
        tf.keras.utils.get_file(fname,origin,cache_dir)
        fname :下载后的文件名
        origin :文件的URL地址
        cache_dir:下载后文件的存储位置
'''
# 下载鸢尾花数据集 iris
import tensorflow as tf

TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
train_path = tf.keras.utils.get_file("iris_training.csv", TRAIN_URL)
fname_list = TRAIN_URL.split('/')
print(fname_list[-1])

# Pandas 访问csv文件
'''
Pandas 库(Panel Data & Data Analysis)
    用于数据统计和分析
    可以高效、方便地操作大型数据集
    # 导入Pandas库
    import pandas as pd
    # 读取csv数据集文件
    pd.read_csv(filepath_or_buffle,header,names)
    names参数:自定义标题,代替header=0参数指定的列标题 names参数的值时一个列表
    # 访问数据
    head()函数:参数为空时,默认读取二维数据列表中的前五行数据
    tail(n)函数:读取后n行数据
    使用切片    df_iris[10:16] 表示读取10~15行数据
    # 显示统计信息
    describe()方法:显示二维数据的统计信息(总数、平均值、标准差、最大值、最小值、25%、50%、75%     numpy
    dataframe中也有显示数据集属性的方法:  .ndim维数   .shape形状    .size元素个数        pandas
       
    
'''
import pandas as pd
import numpy as np

COLUMN_NAMES = ['Sepallength', 'SepalWidth', 'PetaLength', 'PetalWidth', 'Spacies']
df_iris = pd.read_csv(train_path, header=0, names=COLUMN_NAMES)

# print(train_path)
print(df_iris.head(8))  # 读取前8行数据
print(df_iris.tail(8))  # 读取后8行数据
print(df_iris[10:16])  # 读取10~15行数据
print(df_iris.describe())
print(type(df_iris))  # class 'pandas.core.frame.DataFrame'> dataframe是二维表格类型
print(df_iris.ndim)
print(df_iris.shape)
print(df_iris.size)
'''转化为Numpy数组'''
iris = np.array(df_iris)
print(type(iris))  # <class 'numpy.ndarray'> 转化为了numpy数组对象

# 色彩映射
'''
plt.scatter(x,y,c,cmap)
将参数c指定为一个列表或数组,所绘制图形的颜色,可以随这个列表中的元素值而变换,变换所对应得颜色由参数cmap中指定得颜色所提供
'''
import matplotlib.pyplot as plt

plt.scatter(iris[:, 2], iris[:, 3], c=iris[:, 4], cmap='brg')
plt.show()

# 完整程序
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 下载数据集文件
TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
train_path = tf.keras.utils.get_file("iris_training.csv", TRAIN_URL)

# 定义类标题列表 读取数据集文件
COLUMN_NAMES = ['Sepallength', 'SepalWidth', 'PetaLength', 'PetalWidth', 'Spacies']
df_iris = pd.read_csv(train_path, header=0, names=COLUMN_NAMES)

# 将pandas二维数据表转换成numpy二维数组
iris = np.array(df_iris)

# 绘制散点图
plt.scatter(iris[:, 2], iris[:, 3], c=iris[:, 4], cmap='brg')
# 添加散点图的名称 颜色说明
plt.title("Anderson's Iris Data Set\n(Bule->Setosa | Red->Versicolor |Green->Virginica)")
# 设置坐标轴标签 标签直接从列标题列表中得到
plt.xlabel(COLUMN_NAMES[2])
plt.ylabel(COLUMN_NAMES[3])
plt.show()

# 设置画布尺寸
fig = plt.figure('Iris Data', figsize=(15, 15))

# 设置整个绘图的标题
fig.suptitle("Anderson's Iris Data Set\n(Blue->Setosa | Red->Versicolor | Green->virginica")

# for循环绘制子图
for i in range(4):
    for j in range(4):
        #  所绘制子图的行数,列数及子图序号
        plt.subplot(4, 4, 4 * i + (j + 1))  # subplot(行数,列数,子图序号)
        if (i==j):
            plt.text(0.3,0.4,COLUMN_NAMES[i],fontsize=15)
        else:
            plt.scatter(iris[:, j], iris[:, i], c=iris[:, 4], cmap='brg')
        if (i==0):
            plt.title(COLUMN_NAMES[j])
        else:
            plt.ylabel(COLUMN_NAMES[i])

# 调整子图间距
plt.tight_layout(rect=[0, 0, 1, 0.93])
# 显示绘图
plt.show()

手写数字图像数据集MINIST

# 下载MINIST数据集
import tensorflow as tf

mnist = tf.keras.datasets.mnist
(train_x, train_y), (test_x, test_y) = mnist.load_data()

# 分别输出训练集,和测试集的长度
print("Training set:", len(train_x))
print("Testing set:", len(test_x))
# Training set: 60000
# Testing set: 10000
# 输出数据的形状
print("Training set:", train_x.shape, train_x.dtype)
print("Training set:", train_y.shape, train_y.dtype)
# Training set: (60000, 28, 28) uint8
# Training set: (60000,) uint8
# uint8 表示8位无符号整数

# 显示图片
import matplotlib.pyplot as plt
import numpy as np

plt.axis("off")
plt.imshow(train_x[0], cmap="gray")
plt.show()
print(train_y[0])  # 输出标签 显示5

# 随机显示4幅手写数字图片
# 导入需要的库
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

# 加载数据集
mnist = tf.keras.datasets.mnist
(train_x, train_y), (test_x, test_y) = mnist.load_data()

# 绘图
for i in range(4):
    num = np.random.randint(1, 60000)

    plt.subplot(1, 4, i + 1)
    plt.axis("off")
    plt.imshow(train_x[num], cmap="gray")
    plt.title(train_y[num])

plt.show()

numpy实现一元线性回归

'''
numpy实现一元线性回归步骤:
    1.加载数据
    2.设置超参数
    3.设置模型参数初值
    4.训练模型



'''

import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1.加载数据
x = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
                 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
                  62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])

# 2.设置超参数
learn_rate = 0.0001  # 设置学习率
iter = 10 # 设置迭代次数 循环次数设置为100次

disply_step = 1  # 显示间隔    每隔10次显示一次

# 3.设置模型初值
np.random.seed(612)
w = np.random.randn()  # 作为W的初值
b = np.random.randn()

# 4.训练模型
mse = []

for i in range(0, iter + 1):

    # 计算梯度
    dL_dw = np.mean(x * (w * x + b - y))  # 偏导数求梯度
    dL_db = np.mean(w * x + b - y)
    # 使用梯度的结果更新模型的参数
    w = w - learn_rate * dL_dw  # 更新权值
    b = b - learn_rate * dL_db
    # 使用更新后的模型参数计算房价的估计值和均方误差
    pred = w * x + b  # 计算房价的估计值
    Loss = np.mean(np.square(y - pred)) / 2  # 计算均方误差作为损失值
    mse.append(Loss)  # 追加到列表中

    # plt.plot(x,pred)

    if i % disply_step == 0:
        print("i:%i,Loss:%f,w:%f,b:%f" % (i, mse[i],w,b))  # 每隔50次迭代显示一次当前的迭代次数和损失值

# 结果可视化
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(mse)  # 子图一中绘制损失的变化曲线
plt.xlabel("Iteration", fontsize=14)
plt.ylabel("Loss", fontsize=14)

plt.subplot(1, 2, 2)
pred = pred.reshape(-1)
plt.plot(y, color="red", marker="o", label="销售记录")  # 子图二中绘制样本数据
plt.plot(pred, color="blue", marker=".", label="预测房价")  # 绘制模型的预测数据
plt.xlabel("Sample", fontsize=14)
plt.ylabel("Price", fontsize=14)

plt.legend()
plt.show()

import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 加载数据
x = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
              106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
              62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])

# 设置超参数
learn_rate = 0.0001  # 设置学习率
iter = 10  # 设置迭代次数 循环次数设置为100次

disply_step = 1  # 显示间隔    每隔10次显示一次

# 设置模型初值
np.random.seed(612)
w = np.random.randn()  # 作为W的初值
b = np.random.randn()

# 训练模型
mse = []
for i in range(0, iter + 1):

    # 放在前面可以看到使用初始值时的损失值
    pred = w * x + b  # 计算房价的估计值
    Loss = np.mean(np.square(y - pred)) / 2  # 计算均方误差作为损失值
    mse.append(Loss)  # 追加到列表中

    # 计算梯度
    dL_dw = np.mean(x * (w * x + b - y))  # 计算偏导数
    dL_db = np.mean(w * x + b - y)
    # 使用梯度的结果更新模型的参数
    w = w - learn_rate * dL_dw  # 更新权值
    b = b - learn_rate * dL_db


    # plt.plot(x,pred)

    if i % disply_step == 0:
        print("i:%i,Loss:%f,w:%f,b:%f" % (i, mse[i], w, b))  # 每隔50次迭代显示一次当前的迭代次数和损失值

# 结果可视化
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(mse)  # 子图一中绘制损失的变化曲线
plt.xlabel("Iteration", fontsize=14)
plt.ylabel("Loss", fontsize=14)

plt.subplot(1, 2, 2)
pred = pred.reshape(-1)
plt.plot(y, color="red", marker="o", label="销售记录")  # 子图二中绘制样本数据
plt.plot(pred, color="blue", marker=".", label="预测房价")  # 绘制模型的预测数据
plt.xlabel("Sample", fontsize=14)
plt.ylabel("Price", fontsize=14)

plt.legend()
plt.show()

numpy实现多元线性回归

'''
# Numpy实现多元线性回归步骤:
                1.加载数据
                2.数据处理(对样本属性进行归一化,并转换为模型需要的二维数组)
                3.设置超参数
                4,设置模型参数的初始值
                5.训练模型
'''


import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1.加载数据
area = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
                 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
room = np.array([3, 2, 3, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 2, 2, 2])
price = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
                  62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])
# 样本数量
num = len(area)

# 2.数据处理(对样本属性进行归一化,并转换为模型需要的二维数组)
# 创建值全为1的一维数组
x0 = np.ones(num)

# 对商品房面积和房间数进行归一化处理
x1 = (area - area.min()) / (area.max() - area.min())
x2 = (room - room.min()) / (room.max() - room.min())

# 将x0,x1,x2堆叠为形状为(16,3)的二维数组
X = np.stack((x0, x1, x2), axis=1)
# 将房价转化为(16,1)的二维数组
Y = price.reshape(-1, 1)

# 3.设置超参数
learn_rate = 0.01  # 设置学习率
iter = 50  # 设置迭代次数 循环次数设置为500次

disply_step = 10  # 显示间隔    每隔50次显示一次

# 4.设置模型参数的初始值
np.random.seed(612)
W = np.random.randn(3, 1)  # 随机生成形状为(3,1)的数组作为W的初值

# 5.训练模型
mse = []

for i in range(0, iter + 1):

    PRED = np.matmul(X, W)  # 线性模型表达式   计算房价的估计值
    Loss = np.mean(np.square(Y - PRED)) / 2  # 损失函数的表达式     计算均方误差作为损失值
    mse.append(Loss)  # 追加到列表中

    dL_dW = np.matmul(np.transpose(X), np.matmul(X, W) - Y)  # 计算梯度     计算偏导数
    W = W - learn_rate * dL_dW  # 更新模型     更新权值

    if i % disply_step == 0:
        print("i:%i,Loss:%f" % (i, mse[i]))  # 每隔50次迭代显示一次当前的迭代次数和损失值

# 结果可视化
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(mse)  # 子图一中绘制损失的变化曲线
plt.xlabel("Iteration", fontsize=14)
plt.ylabel("Loss", fontsize=14)

plt.subplot(1, 2, 2)
PRED = PRED.reshape(-1)
plt.plot(price, color="red", marker="o", label="销售记录")  # 子图二中绘制样本数据
plt.plot(PRED, color="blue", marker=".", label="预测房价")  # 绘制模型的预测数据
plt.xlabel("Sample", fontsize=14)
plt.ylabel("Price", fontsize=14)

plt.legend()
plt.show()

TensorFlow实现多元线性回归

# TensorFlow实现多元线性回归


import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1.加载数据
area = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
              106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
room = np.array([3, 2, 3, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 2, 2, 2])
price = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
              62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])

num = len(area)
# 2.数据处理(对样本属性进行归一化,并转换为模型需要的二维数组)
# 创建值全为1的一维数组
x0 = np.ones(num)

# 对商品房面积和房间数进行归一化处理
x1 = (area - area.min()) / (area.max() - area.min())
x2 = (room - room.min()) / (room.max() - room.min())

# 将x0,x1,x2堆叠为形状为(16,3)的二维数组
X = np.stack((x0, x1, x2), axis=1)
# 将房价转化为(16,1)的二维数组
Y = price.reshape(-1, 1)

# 3.设置超参数
learn_rate = 0.3  # 设置学习率
iter = 50  # 设置迭代次数 循环次数设置为100次

disply_step = 50  # 显示间隔    每隔10次显示一次

# 4.设置模型参数初始值
np.random.seed(621)
W = tf.Variable(np.random.randn(3, 1))  # 为了能被梯度带自动监视,将w,b封装为Variable对象
b = tf.Variable(np.random.randn())

# 5.训练模型
mse = []

for i in range(0, iter + 1):
    with tf.GradientTape() as tape:
        PRED = tf.matmul(X, W)  # 线性模型表达式   计算房价的估计值
        Loss = tf.reduce_mean(tf.square(Y - PRED)) / 2  # 损失函数的表达式     计算均方误差作为损失值
    mse.append(Loss)  # 追加到列表中

    dL_dW = tape.gradient(Loss,W)  # 计算梯度     计算偏导数
    W.assign_sub(learn_rate*dL_dW)  # 更新模型     更新权值

    if i % disply_step == 0:
        print("i:%i,Loss:%f" % (i, Loss))

TensorFlow实现梯度下降法

# TensorFlow实现梯度下降法

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1.加载数据
x = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
              106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
              62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])

# 2.设置超参数
learn_rate = 0.0001  # 设置学习率
iter = 10  # 设置迭代次数 循环次数设置为100次

disply_step = 1  # 显示间隔    每隔10次显示一次

# 3.设置模型参数初始值
np.random.seed(621)
w = tf.Variable(np.random.randn())  # 为了能被梯度带自动监视,将w,b封装为Variable对象
b = tf.Variable(np.random.randn())

# 4.训练模型
mse = []

for i in range(0, iter + 1):
    with tf.GradientTape() as tape:
        pred = w * x + b  # 线性模型表达式
        Loss = 0.5 * tf.reduce_mean(tf.square(y - pred))  # 损失函数的表达式
    mse.append(Loss)

    dL_dw, dL_db = tape.gradient(Loss, [w, b])  # 手动计算梯度带的代码换成使用梯度带对象的gradient方法来自动获取梯度

    w.assign_sub(learn_rate * dL_dw)  # 使用迭代公式更新模型参数 给Variable对象赋值需要使用他的assign方法  使用assign_sub方法实现减法运算
    b.assign_sub(learn_rate * dL_db)  # 使用迭代公式更新模型参数 给Variable对象赋值需要使用他的assign方法  使用assign_sub方法实现减法运算

    if i % disply_step == 0:
        print("i:%i,Loss:%f,w:%f,b:%f" % (i,Loss,w.numpy(),b.numpy()))

实现一元逻辑回归

# 逻辑回归
# 分类器:能够自动对输入的数据进行分类
#        输入:特征,输出:离散值
'''
手写数字图片————》手写数字识别
向量的形式送入分类器
28x28=784
minist手写数字数据集中每一张图片都是28x28的灰度图片 会以一个包含784各像素的一维向量的形式送入分类器中
经过分类器计算之后输出0~9十个离散的值

实现分类器:
    准备训练样本
    训练分类器
    对样本分类

  单位阶跃函数(unit-step function)

'''
# sigmoid()函数
import tensorflow as tf

print("TensorFlow version:", tf.__version__)

import numpy as np

x = np.array([1., 2., 3., 4.])

w = tf.Variable(1.)
b = tf.Variable(1.)

print(1 / (1 + tf.exp(w * x + b)))  # exp是求e得多少次方
# tf.Tensor([0.11920292 0.04742587 0.01798621 0.00669285], shape=(4,), dtype=float32)
# 结果也是一个形状位4的一维张量

# 交叉熵损失函数
y = np.array([0, 0, 1, 1])
pred = np.array([0.1, 0.2, 0.8, 0.49])
print(1 - y)  # 1-y做广播运算 结果是一维数组
print(1 - pred)

f = -tf.reduce_sum(y * tf.math.log(pred) + (1 - y) * tf.math.log(1 - pred))  # math.log()函数实现以e为底得对数运算
'''每一个样本得交叉熵损失  求和 得到所有得样本得交叉熵损失
.reduce_sum()求和
。reduce_mean() 平均交叉熵损失
'''
print(f)  # tf.Tensor(1.2649975061637104, shape=(), dtype=float64)

# 实现一元线性回归
# 1.加载数据
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x = np.array([137.97, 104.50, 100.00, 126.32, 79.20, 99.00, 124.00, 114.000,
              106.69, 140.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
y = np.array([1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0])

plt.scatter(x, y)
# 2.数据处理
x_train = x - np.mean(x)  # 对数据进行中心化
y_train = y

plt.scatter(x_train, y_train)
# 3.设置超参数和显示间隔
learn_rate = 0.005
iter = 5

disply_step = 1
# 4.设置模型变量得初始值
np.random.seed((612))
w = tf.Variable(np.random.randn())
b = tf.Variable(np.random.randn())

# 5.训练模型
cross_train = []  # 存放训练集得交叉熵损失
acc_train = []  # 存放分类集的分类准确率

for i in range(0, iter + 1):

    with tf.GradientTape() as tape:
        # 计算sigmoid函数
        pred_train = 1 / (1 + tf.exp(-(w * x_train + b)))
        # 交叉熵损失函数
        Loss_train = -tf.reduce_mean(y_train * tf.math.log(pred_train) + (1 + y_train) * tf.math.log(1 - pred_train))
        # 计算准确率 不需要进行求导运算 可以移到with语句外面
        Accuracy_train = tf.reduce_mean(tf.cast(tf.equal(tf.where(pred_train < 0.5, 0, 1), y_train), tf.float32))
    # 记录每一次迭代的交叉熵损失 和 准确率
    cross_train.append(Loss_train)
    acc_train.append(Accuracy_train)
    # 获得损失函数对w和b的偏导数
    dL_dw, dL_db = tape.gradient(Loss_train, [w, b])
    # 更新模型参数
    w.assign_sub(learn_rate * dL_dw)
    b.assign_sub((learn_rate * dL_db))
    # 输出训练过程和结果
    if i % disply_step == 0:
        print("i:%i,Train Loss:%f,Accuracy:%f" % (i, Loss_train, Accuracy_train))

波士顿房价预测01

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 1.加载数据集
boston_housing = tf.keras.datasets.boston_housing
(train_x, train_y), (test_x, test_y) = boston_housing.load_data()

print(train_x.shape, train_y.shape)  # (404, 13) (404,) 表示:404条样本,13条属性

print(test_x.shape, test_y.shape)  # (102, 13) (102,)

# 2.数据处理
x_train = train_x[:, 5]  # 取出所有训练样本中的房间数
y_train = train_y  # 房价
print(x_train.shape, y_train.shape)  # (404,) (404,) 房间数,和房价都是一维数组

x_test = test_x[:, 5]  # 测试集的房间数
y_test = test_y  # 测试集上的房价
print(x_test.shape, y_test.shape)

# 3.设置超参数
learn_rate = 0.04  # 学习率设为0。04
iter = 2000  # 迭代次数设为2000
disply_step = 200  # 显示间隔设为200

# 4.设置模型参数初始值
np.random.seed(612)
w = tf.Variable(np.random.randn())
b = tf.Variable(np.random.randn())
print(w.numpy().dtype, b.numpy().dtype)  # float32 float32

# 5.训练模型
mse_train = []  # 用来记录训练集上的损失   mse:mean square error
mse_test = []  # 用来记录测试集上的损失

for i in range(0, iter + 1):

    with tf.GradientTape() as tape:
        # 把他们放在GradientTape的with语句中实现对wb的监视
        pred_train = w * x_train + b # 计算训练集上的预测值
        loss_train = 0.5 * tf.reduce_mean(tf.square(y_train - pred_train)) # 计算训练集上的均方误差

        pred_test = w * x_test + b
        loss_test = 0.5 * tf.reduce_mean(tf.square(y_test - pred_test))

    mse_train.append(loss_train) # 把训练误差记录在列表中
    mse_test.append(loss_test)

    dL_dw, dL_db = tape.gradient(loss_train, [w, b]) # 使用训练集中的数据计算损失函数对w b的梯度
    w.assign_sub(learn_rate * dL_dw) # 使用算出的梯度更新w b
    b.assign_sub(learn_rate * dL_db)

    if i % disply_step == 0:
        print("i:%i, Train Loss:%f, Test Loss:%f" %(i,loss_train,loss_test))

'''使用训练集上的数据更新模型参数,测试集没有参与
但在每一步迭代中都使用当前的模型参数w b 计算测试集上的误差,并将其记录在mse_test列表中'''

# 6.可视化输出
plt.figure(figsize=(15,10))

plt.subplot(221)
plt.scatter(x_train,y_train,color="blue",label="data") # 绘制散点图
plt.plot(x_train,pred_train,color="red",label="model")  # 绘制模型直线
plt.legend(loc="upper left")

plt.subplot(222)
plt.plot(mse_train,color="blue",linewidth=3,label="train loss")
plt.plot(mse_test,color="red",linewidth=1.5,label="test lost")
plt.legend(loc="upper right")

plt.subplot(223)
plt.plot(y_train,color="blue",marker="o",label="true_price")
plt.plot(pred_train,color="red",marker=".",label="predict")
plt.legend()

plt.subplot(224)
plt.plot(y_test,color="blue",marker="o",label="true_price")
plt.plot(pred_test,color="red",marker=".",label="predict")
plt.legend()

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjxaYeqF-1605190599122)(TensorFlow.assets/波士顿房价预测01.png)]

波士顿房价预测02

# 二维数组归一化---循环语句实现
import numpy as np

x = np.array([[3., 10., 500],
              [2., 20., 200],
              [1., 30., 300],
              [5., 50., 100]])

print(x.shape)
print(len(x))
print(x.shape[0], x.shape[1])

for i in range(x.shape[1]):
    # 对第i列归一化
    x[:, i] = (x[:, i] - x[:, i].min()) / (x[:, i].max() - x[:, i].min())

print(x)  # 循环完成之后所有的列都被归一化

# 二维数组归一化————广播运算
x = np.array([[3., 10., 500],
              [2., 20., 200],
              [1., 30., 300],
              [5., 50., 100]])

print(x.min(axis=0))  # 每一列的最小值
print(x.max(axis=0))  # 每一列的最大值
print(x.max(axis=0) - x.min(axis=0))  # 最大值减去最小值

print(x - x.min(axis=0))  # x-x.min(axis=0) 进行广播运算

print((x - x.min(axis=0)) / (x.max(axis=0) - x.min(axis=0)))  # 广播运算 实现对数组的归一化处理
'''
不用进行循环运算,代码简洁,效率更高
'''

# 波士顿房价归一化处理
# 1.导入需要的库 加载数据集
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np

boston_housing = tf.keras.datasets.boston_housing
(train_x, train_y), (test_x, test_y) = boston_housing.load_data()

print(train_x.shape, train_y.shape)
print(test_x.shape, test_y.shape)
# 训练集和测试集中样本的数量(创建全一数组时需要使用)
num_train = len(train_x)
num_test = len(test_x)

# 2.数据处理
# 对训练样本的所有属性进行归一化
x_train = (train_x - train_x.min(axis=0)) / (train_x.max(axis=0) - train_x.min(axis=0))
y_train = train_y  # 标签y不需要归一化,但是也进行重新赋值

# 对测试样本的所有属性进行归一化
x_test = (test_x - test_x.min(axis=0)) / (test_x.max(axis=0) - test_x.min(axis=0))
y_test = test_y  # 标签y不需要归一化,但是也进行重新赋值

# 生成多元回归需要的二元数组的形式
x0_train = np.ones(num_train).reshape(-1, 1)
x0_test = np.ones(num_test).reshape(-1, 1)

X_train = tf.cast(tf.concat([x0_train, x_train], axis=1), tf.float32)  # .concat() 是tensorflow的数组堆叠函数
X_test = tf.cast(tf.concat([x0_test, x_test], axis=1), tf.float32)  # .cast() 是tensorflow的类型转换函数 指定为32位浮点数

print(X_train.shape, X_test.shape)  # (404, 14) (102, 14) 404个元素  13个属性归一化+堆叠的全为1的属性

Y_train = tf.constant(y_train.reshape(-1, 1), tf.float32)  # 把房价转换成列向量
Y_test = tf.constant(y_test.reshape(-1, 1), tf.float32)

print(Y_train.shape, Y_test.shape)

# 3.设置超参数
learn_rate = 0.01
iter = 3000
display_step = 100

# 4.设置模型变量的初始值
np.random.seed(612)
W = tf.Variable(np.random.randn(14, 1), dtype=tf.float32)

# 5.训练模型
mse_train = []
mse_test = []

for i in range(0, iter + 1):

    with tf.GradientTape() as tape:
        # 计算训练集的预测房价和损失
        PRED_train = tf.matmul(X_train, W)
        Loss_train = 0.5 * tf.reduce_mean(tf.square(Y_train - PRED_train))
        # 计算测试集的预测房价和损失
        PRED_test = tf.matmul(X_test, W)
        Loss_test = 0.5 * tf.reduce_mean(tf.square(Y_test - PRED_test))
    # 记录每一次迭代之后使用更新后的参数(模型在训练集上的损失,和在测试集上的损失值)
    mse_train.append(Loss_train)
    mse_test.append(Loss_test)
    # 使用训练集中的样本更新模型参数
    dL_dW = tape.gradient(Loss_train, W)
    W.assign_sub(learn_rate * dL_dW)

    if i % display_step == 0:
        # 输出训练集和测试集上的损失
        print("i:%i, Train Loss:%f, Test Loss:%f" % (i, Loss_train, Loss_test))

# 可视化输出
plt.figure(figsize=(20,4))

plt.subplot(131)
plt.ylabel("MSE")
plt.plot(mse_train,color="blue",linewidth=3)# mse:mean square error 均方误差
plt.plot(mse_test,color="red",linewidth=1.5)

plt.subplot(132)
plt.plot(y_train,color="blue",marker="o",label="true_price") # .polt() 绘制线图
plt.plot(PRED_train,color="red",marker=".",label="predict")
plt.legend(loc="upper right")  # .legend() 显示图中标签
plt.ylabel("Price")

plt.subplot(133)
plt.plot(y_test,color="blue",marker="o",label="true_price")
plt.plot(PRED_test,color="red",marker=".",label="predict")
plt.legend()
plt.ylabel("Price")

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEurexsc-1605190599128)(TensorFlow.assets/波士顿房价预测02.png)]

波士顿房价可视化

'''
keras:
  是一个高层的神经网络和深度学习库
  可以快速搭建神经网络模型,非常易于调试和扩展
  Tensorflow的官方API
  内置了一些常用的公共数据库,可以通过Keras.datasets模块加载和访问

在机器学习中通常将数据集划分为:训练数据集和测验数据集
'''
# 加载和使用kears中的内置数据集
# 加载数据集
'''
tensorflow.keras.datasets.boston_housing
tensorflow.keras 意思:是keras API 在tensorflow中的实现
'''
import tensorflow as tf

boston_housing = tf.keras.datasets.boston_housing

(train_x, train_y), (test_x, test_y) = boston_housing.load_data(test_split=0)  # 使用这个数据集中的load_data方法加载数据集
'''train_x和train_y接受训练数据集的数据
可以使用test_split=0.2 改变测试数据集在数据集中所占的比例'''
print('Training set:', len(train_x))
print('Testing set:', len(test_x))

print(type(train_x))
print(type(train_y))

print('Dim of train_x:', train_x.ndim)
print('Shape of train_x:', train_x.shape)
# Training set: 506
# Testing set: 0
# <class 'numpy.ndarray'>
# <class 'numpy.ndarray'>
# Dim of train_x: 2
# Shape of train_x: (506, 13)

print(train_x[:5])  # train_x中的前五行数据

# 绘制散点图(平均房间数与房价之间的关系)
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

boston_housing = tf.keras.datasets.boston_housing
(train_x, train_y), (_, _) = boston_housing.load_data(test_split=0)

plt.figure(figsize=(5, 5))  # 设置绘图尺寸
plt.scatter(train_x[0:,5], train_y)  # 绘制散点图
plt.xlabel('RM')  # 设置x轴标签文本
plt.ylabel("Price($1000's)")  # 设置y轴标签文本
plt.title("5.RM-Price")  # 设置标题
plt.show()  # 显示绘图

# 波士顿房价数据集可视化
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

# 加载数据集
boston_housing = tf.keras.datasets.boston_housing
(train_x,train_y),(_,_) = boston_housing.load_data(test_split=0)

# 设置运行时参数
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 定义属性标题列表
titles = ["CRIM","ZN","INDUS","CHAS","NOX","RM","AGE",
          "DIS","RAD","TAX","PTRATIO","B-1000","LSTAT","MEDV"]

# 设置画布尺寸
plt.figure(figsize=(12,12)) # 设置画布尺寸

# 执行循环体 分别绘制13个子图
for i in range(13):
    plt.subplot(4,4,(i+1))
    plt.scatter(train_x[:,i],train_y)
    plt.xlabel(titles[i])   # 子图x轴标签
    plt.ylabel("Price($1000's)")    # 子图y轴标签
    plt.title(str(i+1)+'.'+titles[i]+" - Price")    # 子图标题

plt.tight_layout(rect=[0, 0, 1, 0.9])  # 调整子图间隔
plt.suptitle("各个属性与房价的关系",x=0.5,y=1.02,fontsize=20) # 设置全局标题
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4fHodMv-1605190599130)(TensorFlow.assets/波士顿房价可视化01.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJ2UMwpu-1605190599133)(TensorFlow.assets/波士顿房价可视化02.png)]

梯度下降法求多元线性回归

import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 1.加载数据
area = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
                 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
room = np.array([3, 2, 3, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 2, 2, 2])
price = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
                  62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.31])
# 样本数量
num = len(area)

# 2.数据处理
# 创建值全为1的一维数组
x0 = np.ones(num)

# 对商品房面积和房间数进行归一化处理
x1 = (area - area.min()) / (area.max() - area.min())
x2 = (room - room.min()) / (room.max() - room.min())

# 将x0,x1,x2堆叠为形状为(16,3)的二维数组
X = np.stack((x0, x1, x2), axis=1)
# 将房价转化为(16,1)的二维数组
Y = price.reshape(-1, 1)

# 3.设置超参数
learn_rate = 0.001  # 设置学习率
iter = 6000  # 设置迭代次数 循环次数设置为500次

disply_step = 30  # 显示间隔    每隔50次显示一次

# 设置模型参数的初始值
np.random.seed(612)
W = np.random.randn(3, 1)  # 随机生成形状为(3,1)的数组作为W的初值

# 4.训练模型
mse = []
for i in range(0, iter + 1):
    dL_dW = np.matmul(np.transpose(X), np.matmul(X, W) - Y)  # 计算偏导数
    W = W - learn_rate * dL_dW  # 更新权值

    PRED = np.matmul(X, W)  # 计算房价的估计值
    Loss = np.mean(np.square(Y - PRED)) / 2  # 计算均方误差作为损失值
    mse.append(Loss)  # 追加到列表中

    if i % disply_step == 0:
        print("i:%i,Loss:%f" % (i, mse[i]))  # 每隔50次迭代显示一次当前的迭代次数和损失值

# 5.结果可视化
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(mse)  # 子图一中绘制损失的变化曲线
plt.xlabel("Iteration", fontsize=14)
plt.ylabel("Loss", fontsize=14)

plt.subplot(1, 2, 2)
PRED = PRED.reshape(-1)
plt.plot(price, color="red", marker="o", label="销售记录")  # 子图二中绘制样本数据
plt.plot(PRED, color="blue", marker=".", label="预测房价")  # 绘制模型的预测数据
plt.xlabel("Sample", fontsize=14)
plt.ylabel("Price", fontsize=14)

plt.legend()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itTKgmVS-1605190599141)(TensorFlow.assets/梯度下降法.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值