深度学习第三弹:python入门与线性表示代码

news2025/1/10 19:18:37

一、python入门

1.熟悉基础数据结构——整型数据,浮点型数据,列表,字典,字符串;了解列表及字典的切片,插入,删除操作。

list1 = [1, 2, 3, 4, 5]
for each in list1:
    print(each)
print(list1[1:4]) #左闭右开
print(list1[0:4])
print(list1[2:-1])
print(list1[2:])
print(list1[:])  #列表的切片
list1 = [1, 2, 3, 4, 5, 6]
print(list1)
list1.remove(4) #列表的删除操作
print(list1)
del list1[3]
print(list1)
list1.append(7) #列表的插入
print(list1)

2.了解python中类的定义与操作,下面是一个简单的例子

class person():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

创造一个superman类对person进行继承:

class superman(person):
    def __init__(self, name, age):
        super(superman, self).__init__(name, age)
#这行代码调用了父类 person 的 __init__ 方法,并传递了 name 和 age 参数。
        self.fly_ = True
        self.name = name
        self.age = age

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

    def fly(self):
        if self.fly_ == True:
            print("飞起来!")

3.了解矩阵与张量的基本操作

#矩阵操作
list1 = [1, 2, 3, 4, 5]
print(list1)
array = np.array(list1)   #把list1转化为矩阵
print(array)

#矩阵的操作
array2 = np.array(list1)
print(array2)
array3 = np.concatenate((array, array2), axis=1)#横向合并列表为矩阵
print(array3)
#矩阵切片
array = np.array(list1)
print(list1[1:3])
print(array[:, 1:3])#保留1 2列

#跳着切
idx = [1,3]
print(array[:, idx])#保留1 3列
#张量操作
list1 = \
 [
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10],
  [11, 12, 13, 14, 15]
 ]

tensor1 = torch.tensor(list1)#将list1转化为张量
print(tensor1)

x = torch.tensor(3.0)
x.requires_grad_(True)#指示PyTorch需要计算x的梯度
y = x**2
y.backward()#反向传播计算梯度

二:简单的线性表示代码

根据处理数据,定义模型,定义损失函数,优化参数的步骤,首先生成一批数据:

import torch
import matplotlib.pyplot as plt

def create_data(w, b, data_num):
    x = torch.normal(0, 1, (data_num, len(w))) #生成一个形状为 (data_num, len(w)) 的张量 x,其中 data_num 是数据点的数量,len(w) 是权重向量 w 的长度(即输入特征的数量),张量x 的每个元素都是服从标准正态分布的随机采样值
    y = torch.matmul(x, w) + b   #matmul表示矩阵相乘

    noise = torch.normal(0, 0.01, y.shape)# 生成一个与 y 形状相同的噪声张量 noise,其中每个元素都是从均值为0,标准差为0.01的正态分布中随机采样得到的。

    y += noise
    return x, y

num = 500#数据行数为500

true_w = torch.tensor([8.1,2,2,4])
true_b = torch.tensor(1.1)


X, Y = create_data(true_w, true_b, num)#得到用于训练的数据集X,Y,X为500*4的数据,Y为500*1的数据


plt.scatter(X[:, 1], Y, 1)#利用scatter绘制散点图
plt.show()

通过以上操作我们就得到了用于训练的X,Y以及w和b的真实值。按步长为batchsize访问数据

def data_provider(data, label, batchsize):   #每次访问这个函数,就提供一批数据
    length = len(label)
    indices = list(range(length))
    random.shuffle(indices)


    for each in range(0, length, batchsize):#成批访问数据
        get_indices = indices[each: each+batchsize]
        get_data = data[get_indices]
        get_label = label[get_indices]

        yield get_data, get_label

定义loss函数为\sum \left | \widehat{y}-y\right |/N

def fun(x, w, b):#得到y的预测值
    pred_y = torch.matmul(x, w) + b
    return pred_y

def maeLoss(pre_y, y):#定义loss函数
    return torch.sum(abs(pre_y-y))/len(y)

使用随机梯度下降(SGD)方法更新参数,

def sgd(paras, lr):   #随机梯度下降,更新参数
    with torch.no_grad(): #在更新参数时,我们不需要计算梯度。
        for para in paras:
            para -= para.grad * lr
            para.grad.zero_()    #更新完参数后,它将每个参数的梯度清零(.zero_() 方法),以便在下一次参数更新前不会累积之前的梯度。

确定学习率lr与初始参数w_0,b_0,注意w_0与b_0的维度。

lr = 0.03
w_0 = torch.normal(0, 0.01, true_w.shape, requires_grad=True) #这个w需要计算梯度
b_0 = torch.tensor(0.01, requires_grad=True)

定义训练轮次与训练函数

epochs = 50

for epoch in range(epochs):
    data_loss = 0
    for batch_x, batch_y in data_provider(X, Y, batchsize):
        pred_y = fun(batch_x, w_0, b_0)#前向传播
        loss = maeLoss(pred_y, batch_y)#计算损失
        loss.backward()#反向传播
        sgd([w_0, b_0], lr)#更新参数
        data_loss += loss

    print("epoch %03d: loss: %.6f"%(epoch, data_loss))

最后数据可视化

print("真实的函数值是", true_w, true_b)
print("训练得到的参数值是", w_0, b_0)

idx = 0#某一列X数据
plt.plot(X[:, idx].detach().numpy(), X[:, idx].detach().numpy()*w_0[idx].detach().numpy() + b_0.detach().numpy())
plt.scatter(X[:, idx], Y, 1)
plt.show()

完整代码如下:

import torch
import matplotlib.pyplot as plt #画图必备
#产生随机数
import random

def create_data(w, b, data_num): #生成数据
    x = torch.normal(0, 1, (data_num, len(w)))
    y = torch.matmul(x, w) + b   #matmul表示矩阵相乘

    noise = torch.normal(0, 0.01, y.shape)
    y += noise
    return x, y

num = 500

true_w = torch.tensor([8.1,2,2,4])
true_b = torch.tensor(1.1)


X, Y = create_data(true_w, true_b, num)


plt.scatter(X[:, 1], Y, 1)
plt.show()



def data_provider(data, label, batchsize):   #每次访问这个函数,就提供一批数据
    length = len(label)
    indices = list(range(length))
    random.shuffle(indices)


    for each in range(0, length, batchsize):
        get_indices = indices[each: each+batchsize]
        get_data = data[get_indices]
        get_label = label[get_indices]

        yield get_data, get_label

batchsize = 16

def fun(x, w, b):
    pred_y = torch.matmul(x, w) + b
    return pred_y

def maeLoss(pre_y, y):
    return torch.sum(abs(pre_y-y))/len(y)

def sgd(paras, lr):   #随机梯度下降,更新参数
    with torch.no_grad(): #属于这句代码的部分,不计算梯度
        for para in paras:
            para -= para.grad * lr
            para.grad.zero_()    #使用过的梯度,归0

lr = 0.03
w_0 = torch.normal(0, 0.01, true_w.shape, requires_grad=True) #这个w需要计算梯度
b_0 = torch.tensor(0.01, requires_grad=True)
print(w_0, b_0)

epochs = 50

for epoch in range(epochs):
    data_loss = 0
    for batch_x, batch_y in data_provider(X, Y, batchsize):
        pred_y = fun(batch_x, w_0, b_0)
        loss = maeLoss(pred_y, batch_y)
        loss.backward()
        sgd([w_0, b_0], lr)
        data_loss += loss

    print("epoch %03d: loss: %.6f"%(epoch, data_loss))

print("真实的函数值是", true_w, true_b)
print("训练得到的参数值是", w_0, b_0)

idx = 0
plt.plot(X[:, idx].detach().numpy(), X[:, idx].detach().numpy()*w_0[idx].detach().numpy() + b_0.detach().numpy())
plt.scatter(X[:, idx], Y, 1)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见的端口号大全,2025年整理

端口号是网络通信的基础,它定义了不同服务的入口和出口。了解服务端口号不仅有助于网络配置,还能提升问题排查效率。在实际应用中,熟悉常见端口号可以帮助你快速定位网络故障、优化服务性能,并确保网络安全。 一、常见的网络服务…

Android adb shell GPU信息

Android adb shell GPU信息 先 adb shell 进入控制台。 然后: dumpsys | grep GLES Android adb shell命令捕获systemtrace_android 抓trace-CSDN博客文章浏览阅读2.5k次,点赞2次,收藏8次。本文介绍了如何使用adbshell命令配合perfetto工…

【LeetCode】力扣刷题热题100道(21-25题)附源码 接雨水 合并区间 字母异位词 滑动窗口 覆盖子串(C++)

目录 1.接雨水 2.合井区间 3.找到字符串中所有字母异位词 4.滑动窗口最大值 5.最小覆盖子串 1.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 代码如下所示: class Solution {…

01-51单片机LED与独立按键

一、单片机概述 注意:个人学习笔记,里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了,这里是默认都会的状态学习单片机。 1.什么是单片机 单片机,英文Micro Controller Unit,简称MCU。其内部集成了CPU、R…

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么? USB接口(Universal Serial Bus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电…

ModelScope创空间使用

文章目录 前言 一、ModelScope是什么? 二、使用步骤 1.注册ModelScope 2.新建创空间 3.创空间基本说明 4.部署创空间 5.访问创空间 三、其他补充说明 总结 前言 随着AI大模型的应用越来越广泛,模型应用部署的需求也越来越多,包括h…

记1(监督学习+一元线性回归

目录 1、基础概念2、一元线性回归 1、基础概念 机器学习(Machine Learning):通过学习算法从数据中学习模型的过程 例如从“房价y~面积x”的关系中学习: 建立模型:ywxb 学习模型:确定w,b&#x…

服务器双网卡NCCL通过交换机通信

1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…

PySide6 Qt for Python Qt Quick参考网址

Qt QML BOOK: 《Qt for Python》 -Building an Application https://www.qt.io/product/qt6/qml-book/ch19-python-build-app#signals-and-slots Qt for Python:与C版本的差异即BUG处理(常见的DLL文件确实的问题等) Qt for Pyt…

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新,其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象,包括视图(View)、包(Package)、存储过程(Procedur…

【Elasticsearch7.11】postman批量导入少量数据

JSON 文件内的数据格式,json文件数据条数不要过多,会请求参数过大,最好控制再10000以内。 {"index":{"_id":"baec07466732902d22a24ba01ff09751"}} {"uuid":"baec07466732902d22a24ba01ff0975…

用Kimi做研究:准实验设计的智能解决方案

目录 1.研究策略设计 2.过程框架设计 3.背景变量 4.细节设计 准实验设计是一种介于实验与观察研究之间的研究方法,准实验设计是在无法完全控制实验条件的情况下进行因果关系的探索。与传统实验设计相比,准实验设计不具备随机分配实验对象到各处理组的…

零基础入门Erlang

1.Erlang介绍 Index - Erlang/OTP Erlang是一种通用的面向并发的编程语言 Erlang是一个结构化,动态类型编程语言,内建并行计算支持 使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的 1.1 为什么选择Erlang 需要处理大量…

JavaWeb开发(九)JSP技术

1. JavaWeb JSP技术 1.1. JSP简介 1.1.1. 什么是JSP JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。在JSP中java代码与HTML共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容。 1.1.2. 为什么出现JSP技术 19…

鸿蒙UI开发——Toast即时提示框的使用

1、概 述 Toast提示又称即时反馈,是一种临时性的消息提示框,用于向用户显示简短的操作反馈或状态信息。它通常在屏幕的底部或顶部短暂弹出,随后在一段时间后自动消失。即时反馈的主要目的是提供简洁、不打扰的信息反馈,避免干扰用…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 宠物医院…

【UE5 C++课程系列笔记】24——多线程基础——Async

目录 概念 Async函数应用案例 概念 Async 函数的原型如下 template<typename TFunction> auto Async(EAsyncExecution::Type ExecutionType, TFunction&& Function) -> decltype(Function); Async 函数是一个模板函数&#xff0c;接受两个主要参数&#x…

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…

RabbitMQ-SpringAMQP使用介绍

RabbitMQ 1. Spring AMQP1.1 引入依赖1.2 消息发送1.3 消息接收1.4 WorkQueue模型1.4.1 实例代码1.4.2 能者多劳1.4.3 总结 1.5交换机1.6 Fanout交换机&#xff08;广播&#xff09;1.7 Direct交换机&#xff08;订阅&#xff09;1.8 Topic交换机&#xff08;通配符订阅&#x…

Can I Use 实战指南:优化你的前端开发流程

引言 浏览器兼容性问题一直是前端开发中最令人头疼的难题。无论是新技术的支持差异&#xff0c;还是老旧浏览器的兼容需求&#xff0c;开发者常常需要花费大量时间解决这些问题。而 Can I Use 正是为此而生的前端开发利器。它提供详尽的浏览器兼容性数据&#xff0c;帮助开发者…