给出要求
在PyTorch里面使用torch.cat()
函数来实现Tensor的拼接:
import torch
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import torch.nn as nn
from torch.autograd import Variable # torch 中 Variable 模块
def make_features(x):
x = x.unsqueeze(1)
return torch.cat([x ** i for i in range(1,4)],1) # 矩阵拼接一下,相当于输入的n个数据
"""Builds features i.e. a matrix with columns [x, x^2, x^3]"""
# 定义真实函数
W_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])
def f(x) :
"""Approximated function."""
return x.mm(W_target)+b_target[0]
"""
这里的权重已经定义好了,unsqueeze(1)是将原来的tensor 大小由3变成(3, 1),
x.mm (w_ target) 表示做矩阵乘法,f(x) 就是每次输人- -个x得到-个y的真实函数。
"""
在进行训练的时候我们需要采样一些点,可以随机生成一些数来得到每次的训练集:
# 在进行训练的时候我们需要采样一些点,可以随机生成一些数来得到每次的训练集:
def get_batch(batch_size=32):
#""Builds a batch i.e. (x, f(x)) pair. ”””
random = torch.randn(batch_size)
x = make_features(random)
y = f(x)
if torch.cuda.is_available():
return Variable(x).cuda(), Variable(y).cuda()
else:
return Variable(x),Variable(y)
通过上面这个函数我们每次取batch_size 这么多个数据点,然后将其转换成矩阵的形式,再把这个值通过函数之后的结果也返回作为真实的目标。
# Define model 定义多项式模型
class poly_model(nn.Module) :
def __init__(self):
super(poly_model, self).__init__()
self.poly = nn.Linear(3, 1) # 模型的输入是3维,输出是1维
def forward(self,x) :
out = self.poly(x)
return out
if torch.cuda.is_available():
model = poly_model().cuda()
else:
model = poly_model()
#定义损失函数和优化器
#这里使用梯度下降
criterion = nn.MSELoss() #在这里定义的损失函数,然后可以把criterion当作函数来使用,相当于C++的函数指针 了
optimizer = torch.optim.SGD(model.parameters(),lr=1e-3) # 与上句同理
#和上一篇博文一样
# 开始训练模型
epoch = 0
while True:
# Get data
batch_x,batch_y = get_batch()
# Forward pass
output = model(batch_x)
loss = criterion(output, batch_y)
print_loss = loss.data
# Reset gradients
optimizer.zero_grad()
# Backward pass
loss.backward()
# update parameters
optimizer.step()
epoch += 1
if print_loss < 1e-3:
break
W_target
#这就是拟合出的曲线的权重,据此可以写出拟合的曲线方程
tensor([[0.5000],
[3.0000],
[2.4000]])
b_target
tensor([0.9000])
但是我画不出来,头秃………………………………
点这里
点这里
2
成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘