以下是我的代码,为什么运行之后会出现a Tensor with 100 elements cannot be converted to Scalar的错误呢?该如何修改呢?
import torch
import numpy as np
import sys
import torchvision
import torchvision.transforms as transforms
sys.path.append("C:/Users/zyx20/Desktop/深度学习编程/pythonProject")
import d2lzh_pytorch as d2l
#在训练数据集和测试数据集中,给定样本特征 ,我们使⽤如下的三阶多项式函数来⽣成该样本的标签:y=1.2x-3.4x²+5.6xsancifang+噪声项
#其中噪声项 服从均值为0、标准差为0.01的正态分布。训练数据集和测试数据集的样本数都设为100。
n_train,n_test,true_w,true_b=100,100,[1.2,-3.4,5.6],5
features=torch.randn((n_train + n_test,1))
poly_features=torch.cat((features,torch.pow(features,2),torch.pow(features,3)),1)
labels=(true_w[0]*poly_features[:,0]+true_w[1]*poly_features[:,1]+true_w[2]*poly_features[:,2]+true_b)
labels+=torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float)
#定义作图函数semilogy
def semilogy(x_vals,y_vals,x_label,y_label,x2_vals=None,y2_vals=None,legend=None,figsize=(3.5,2.5)):
d2l.set_figsize(figsize)
d2l.plt.xlabel(x_label)
d2l.plt.ylabel(y_label)
d2l.plt.semilogy(x_vals,y_vals)
if x2_vals and y2_vals:
d2l.plt.semilogy(x2_vals,y2_vals,linestyle=':')
d2l.plt.legend(legend)
#定义损失函数,并把模型定义部分放在fit_and_plot函数中
num_epochs,loss=100,torch.nn.MSELoss()
def fit_and_plot(train_features,test_features,train_labels,test_labels):
net=torch.nn.Linear(train_features.shape[-1],1)
batch_size=min(10,train_labels.shape[0])
dataset=torch.utils.data.TensorDataset(train_features,train_labels)
train_iter=torch.utils.data.DataLoader(dataset,batch_size,shuffle=True)
optimizer=torch.optim.SGD(net.parameters(),lr=0.01)
train_ls,test_ls=[],[]
for _ in range(num_epochs):
for X,y in train_iter:
l=loss(net(X),y.view(-1,1))
optimizer.zero_grad()
l.backward()
optimizer.step()
train_labels=train_labels.view(-1,1)
test_labels=test_labels.view(-1,1)
train_ls.append(loss(net(train_features),train_labels.item()))
test_ls.append(loss(net(test_features),test_labels).item())
print('final epoch:train loss',train_ls[-1],'test loss',test_ls[-1])
semilogy(range(1,num_epochs+1),train_ls,'epochs','loss',range(1,num_epochs+1),test_ls,['train','test'])
print('weight:',net.weight.data,'\nbias:',net.bias.data)
fit_and_plot(poly_features[:n_train,:],poly_features[n_train:,:],labels[:n_train],labels[n_train:])