网站设计与网页配色实例精讲pdf,用wordpress做博客,包头正大光电 做网站,wordpress 入门pdf1#xff09;自动导入常用库的设置方式
在开始之前#xff0c;这里介绍一下自动导入常用的你需要加载的库的操作方式。
首先在我们的目录下找到ipython文件#xff0c;如下图#xff1a; 然后找到里面的startup文件#xff1a; 然后新建一个文本文档#xff0c;输入你每…1自动导入常用库的设置方式
在开始之前这里介绍一下自动导入常用的你需要加载的库的操作方式。
首先在我们的目录下找到ipython文件如下图 然后找到里面的startup文件 然后新建一个文本文档输入你每次要导入的库的代码例子如下 注意这里要符合python的缩进格式。然后改名字为start.py 然后我们重启一下kernel或者随便新建一个python文件来验证是否成功导入 如果结果如上图所示没有导入任何库直接能调用说明已经自动导入成功。
2)手动实现简单数据生成函数
为了后续做实验的方便我们需要手动实现一个自己的数据生成函数。当我们可以自定义数据生成的规律我们将数据喂给模型就可以判断模型是否掌握了我们定义的规律从而判断模型的性能这也是从炼丹师进步到化学家的必经之路。
下面我们以最简单的回归类数据集来举例
def TensorGenRe(num_examples1000,w[2,1,1],biasTrue,delta0.01,deg1):回归类数据集创建函数1 num_examples:创建数据集的数据量2 w:包括截距的(如果存在)特征系数向量3 bias:是否需要截距4 delta:扰动项取值5 deg 方程的最高次数if bias True:#如果有偏差项最后一位是b应该从特征张量中舍去num_inputs len(w)-1 #这里一律用标注正太分布举例features_true torch.randn(num_examples,num_inputs)#这里由于最后一列是偏差所以去掉然后转化为列向量最后由于后面要进行矩阵乘法所以转化为浮点数w_true torch.tensor(w[:-1]).reshape(-1,1).float()b_true torch.tensor(w[-1]).float()#这里需要判断是否只有一列,决定了是用矩阵乘法还是简单的powif num_inputs 1:labels_truetorch.pow(features_true, deg)* w_true b_trueelse:labels_true torch.mm(torch.pow(features_true, deg),w_true) b_true#这里需要加上一列1为了方便后续的矩阵乘法相当于w*x1*bfeatures torch.cat((features_true, torch.ones(len(features_true), 1)),1)#最后乘以扰动项的系数deltalabels labels_true torch.randn(size labels_true.shape)* deltaelse:#下面的逻辑和上面一样num_inputslen(w)features torch.randn(num_examples,num_inputs)w_true torch.tensor(w).reshape(-1,1).float()if num_inputs 1:labels_true torch.pow(features,deg)*w_trueelse:labels_true torch.mm(torch.pow(features, deg),w_true)labels labels_true torch.randn(size labels_true.shape)* deltareturn features, labels
关于上面代码的解释写在注释里面另外需要注意的是上面这个函数不能实现含有交叉项的方程下面我们可以尝试调用实验一下 我们可以通过画图来验证结果:
#绘制图像查看结果
plt.subplot(223)
plt.scatter(features[:,0],labels)#第一个特征和标签的关系
plt. subplot(224)
plt.scatter(features[:, 1],labels)#第二个特征和标签的关系 3)手动实现训练集和测试集的切分
def data_split(features,labels,rate0.7):#rate是训练集占所有数据的比例num_examples len(features)#这里是创建一个数据集的行索引列表indices list(range(num_examples))#通过打乱索引然后再映射到原数据集实现随机random.shuffle(indices)num_train int(num_examples*rate)#由于这里已经打乱过了所以直接选前num_train个就行indices_train torch.tensor(indices[:num_train])indices_test torch.tensor(indices[num_train:])x_train features[indices_train]y_train labels[indices_train]x_test features[indices_test]y_test labels[indices_test]return x_train,y_train,x_test,y_test
我们可以做一个简单的调用来验证一下: 4)再谈Dataset和Dataloader
random_split函数 我们发现pytorch内置的split函数返回的不是数据的实体张量而是两个迭代器这其实和pytorch设计哲学有关。当我们处理海量数据的时候如果我们直接分别存储训练集和测试集的两部分实体数据会非常占用内存和计算资源。在很多教程中数据集划分过程会推荐使用scikit-learn中的train_test_split函数该函数就是直接存储数据实体对于初学者更加友好一点。所以这里pytorch并没有真正的实际存储而是和上面我们手动实现的一样是进行映射处理成迭代器我们可以通过和之前一样的循环操作来遍历打印出来。
下面我们回顾一下之前的流程 我们之前就说dataset是用来进行打包封装操作的可以发现下面返回的也是一个dataset的一个子类TensorDataset同样也是一个生成器。这是一个可以用来在上下文环境中互相传的子类例如可以接着给dataloader所以在整个pytorch的流程中都是以类迭代器的方式流动的而并不是以数据实体进行流动。但是这个函数只能用来封装tensor并不能用来封装更一般的数据类型。 下面用一个库里面有的乳腺癌数据集的例子来说明如何处理一般情况的数据集 我们还是一样地可以通过data和target来查看特征和标签
下面我们通过创建一个新的dataset子类并且重写其中的几个方法来实现一般数据的封装
class LBCDataset(Dataset):def __init__(self, data):self.features data.dataself.labels data.targetself.lens len(data.data)# 输入index数值方法最终返回index对应的特征和下标def __getitem__ (self,index):return self.features[index,:], self.labels[index]def __len__(self):return self.lens 下面我们用random_split来进行切分 当我们查看LBC_train会发现它只有dataset和indices两个属性同样的是一个映射式的对象其中dataset属性用于查看原数据集对象indices属性用于查看切分后数据集的每一条数据的index 我们可以分别调用查看 下面我们来看dataloader 我们会发现一个有意思的地方这里的dataset属性返回的其实是LBC_train也就是说这里的dataset属性存在一种类似于回溯的还原机制。
最后我们用一张图来总结上面的流程