一、补充知识:

1. Tensor和tensor的区别:


在PyTorch中,Tensor和tensor都能用于生成新的张量:

>>>import numpy as np
>>> a=torch.Tensor([1,2])
>>> a
tensor([1., 2.])
>>> a=torch.tensor([1,2])
>>> a
tensor([1, 2])
2. 计算图

https://zhuanlan.zhihu.com/p/69294347

3. 《动手学深度学习》

https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter02_prerequisite/2.2_tensor

二、代码部分

1. 前馈过程


pytorch 计算tensor内存大小 pytorch tensor tensor_线性模型

2. 线性模型的计算图(一)


pytorch 计算tensor内存大小 pytorch tensor tensor_权值_02

2.1 代码实现
import numpy as np
import matplotlib.pyplot as plt
import torch

# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = torch.Tensor([1.0])  # 初始权值
w.requires_grad = True   # 计算梯度,True是需要计算,False是不计算的


def forward(x):     # 定义线性模型 y^ = x * w
    return x * w    # w 是 Tensor , 所以会自动将x 转换为Tensor


def loss(x, y):     # 定义损失函数,构建计算图
    y_pred = forward(x)
    return (y_pred - y) ** 2     # loss = (y^ - y)**2

epoch_list = []
loss_list = []
print('Predict (befortraining)', 4, forward(4))

for epoch in range(100):    # 训练过程
    for x, y in zip(x_data, y_data):
        l = loss(x, y)      # 前馈过程
        l.backward()        # 反馈过程,.backward自动对w求导,
        print('\tgrad:', x, y, w.grad.item())  # item是将梯度grad里的数值拿出来变成一个标量
        w.data = w.data - 0.01 * w.grad.data   # 注意这里的grad是一个tensor,所以要取他的data,0.01是学习率
        w.grad.data.zero_()                    # 释放之前计算的梯度,清零
    print('Epoch:', epoch, 'loss=', l.item())
    epoch_list.append(epoch)    # 生成epoch列表,便于后面画图
    loss_list.append(l.item())  # 生成loss列表,便于后面画图
print('Predict(after training)', 4, forward(4).item())

# 打印损失图
plt.plot(epoch_list,loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()


pytorch 计算tensor内存大小 pytorch tensor tensor_权值_03

3. 线性模型的计算图(二)


pytorch 计算tensor内存大小 pytorch tensor tensor_权值_04

3.1 代码实现
import numpy as np
import matplotlib.pyplot as plt
import torch

# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = torch.Tensor([1.0])    # 初始权值, #
w.requires_grad = True     # requires_grad = True计算梯度,True是需要计算,False是不计算的
b = torch.Tensor([2.0])
b.requires_grad=True

def forward(x):         # 定义线性模型 y^ = x * w
    return x * w +b     # w 是 Tensor , 所以会自动将x 转换为Tensor


def loss(x, y):         # 定义损失函数,构建计算图
    y_pred = forward(x)
    return (y_pred - y) ** 2  # loss = (y^ - y)**2


epoch_list = []
loss_list = []
print('Predict (befortraining)', 4, forward(4))

for epoch in range(500):  # 训练过程,epoch设为500时效果明显
    for x, y in zip(x_data, y_data):
        l = loss(x, y)  # 前馈过程
        l.backward()  # 反馈过程,.backward自动对w求导,
        print('\tgrad:', x, y, w.grad.item(), b.grad.item())  # item是将梯度grad里的数值拿出来变成一个标量
        w.data = w.data - 0.01 * w.grad.data  # 对w做更新,注意这里的grad是一个tensor,所以要取他的data,0.01是学习率
        b.data = b.data - 0.01 * b.grad.data
        w.grad.data.zero_()  # 释放之前计算的梯度,清零
        b.grad.data.zero_()
    print('Epoch:', epoch, 'loss=', l.item())
    epoch_list.append(epoch)  # 生成epoch列表,便于后面画图
    loss_list.append(l.item())  # 生成loss列表,便于后面画图
print('Predict(after training)', 4, forward(4).item())

# 打印损失图
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()


pytorch 计算tensor内存大小 pytorch tensor tensor_权值_05

4. 课后作业


pytorch 计算tensor内存大小 pytorch tensor tensor_python_06

4.1 代码实现
import matplotlib.pyplot as plt
import torch

# 定义数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w1 = torch.Tensor([1.0])  # 初始权值
w1.requires_grad = True  # requires_grad = True计算梯度,True是需要计算,False是不计算的
w2 = torch.Tensor([1.0])  # 初始权值
w2.requires_grad = True
b = torch.Tensor([2.0])
b.requires_grad = True


def forward(x):  # 定义线性模型 y^ = x * w
    return w1 * x**2 + w2 * x + b


def loss(x, y):  # 定义损失函数,构建计算图
    y_pred = forward(x)
    return (y_pred - y) ** 2  # loss = (y^ - y)**2


epoch_list = []
loss_list = []
print('Predict (befortraining)', 4, forward(4))

for epoch in range(100):  # 训练过程
    for x, y in zip(x_data, y_data):
        l = loss(x, y)  # 前馈过程
        l.backward()  # 反馈过程,.backward自动对w求导,
        print('\tgrad:', x, y, w1.grad.item(), w2.grad.item(),b.grad.item())  # item是将梯度grad里的数值拿出来变成一个标量
        w1.data = w1.data - 0.01 * w1.grad.data  # 对w做更新,注意这里的grad是一个tensor,所以要取他的data,0.01是学习率
        w2.data = w2.data - 0.01 * w1.grad.data
        b.data = b.data - 0.01 * b.grad.data
        w1.grad.data.zero_()  # 释放之前计算的梯度,清零
        w2.grad.data.zero_()
        b.grad.data.zero_()
    print('Epoch:', epoch, 'loss=', l.item())
    epoch_list.append(epoch)  # 生成epoch列表,便于后面画图
    loss_list.append(l.item())  # 生成loss列表,便于后面画图
print('Predict(after training)', 4, forward(4).item())

# 打印损失图
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()


pytorch 计算tensor内存大小 pytorch tensor tensor_线性模型_07