网易微专业高级前端开发工程师2022年完结无密东方其大道满霞光

#1

download:网易微专业高级前端开发工程师2022年完结无密东方其大道满霞光

Pytorch构建神经网络
神经网络由对数据进行操作的层或模块组成。Torch.nn命名空间提供了构建神经网络所需的所有模块。PyTorch中的每个模块都是nn的子类。组件…神经网络本身也是一个模块,但它是由其他模块(层)组成的。这种嵌套结构使得复杂的体系结构易于构建和管理。
在下一部分中,我们将构建一个神经网络来对FashionMNIST数据集中的图像进行分类。
导入操作系统
进口火炬
从火炬进口nn
从torch.utils.data导入数据加载器
从torchvision导入数据集、转换
复制代码
1.获得培训设备
我们希望能够在GPU(如果可用的话)等硬件加速器上训练我们的模型。我们先检查一下torch.cuda是否可用,否则就继续用CPU。
device = "cuda “如果torch.cuda.is_available()否则” cpu "
打印(f“使用{设备}设备”)
复制代码
使用cuda设备
复制代码
2.定义模型类
我们定义我们的神经网络nn。模块,并在__init__中初始化神经网络层。每个nn。Module子类在forward方法中实现对输入数据的操作。
类神经网络(nn。模块):
def init(self):
超级(NeuralNetwork,self)。init()
self.flatten = nn。展平()
self.linear_relu_stack = nn。顺序(
nn。线性(28*28,512),
nn。ReLU(),
nn。线性的(512,512),
nn。ReLU(),
nn。线性(512,10),
)

向前定义(自身,x):
x = self.flatten(x)
logits = self . linear _ relu _ stack(x)
返回逻辑
复制代码
我们创建一个NeuralNetwork实例,将其移动到设备,并打印其结构。
model = NeuralNetwork()。至(设备)
打印(模型)
复制代码
神经网络(
(flatten): Flatten(start_dim=1,end_dim=-1)
(linear_relu_stack):顺序(
(0):线性(输入特征=784,输出特征=512,偏差=真)
(1): ReLU()
(2):线性(输入特征=512,输出特征=512,偏差=真)
(3): ReLU()
(4):线性(输入特征=512,输出特征=10,偏差=真)
)
)
复制代码
为了使用模型,我们将输入数据传递给它。这将执行模型的转发,以及一些后台操作。但是不要直接调用model.forward()。
在输入上调用模型将返回一个二维张量,其中dim=0对应每类的10个原始预测值的每个输出,dim=1对应每个输出的每个值。通过一个神经网络的例子,得到了预测概率。Softmax模块。
X = torch.rand(1,28,28,设备=设备)
logits =模型(X)
pred _ probab = nn。Softmax(dim=1)(logits)
y _ pred = pred _ probable . arg max(1)
print(f "预测类:{y_pred} ")
复制代码
预测类:张量([7],device='cuda:0 ')
复制代码

3.模型层
我们来详细解释一下FashionMNIST模型中的每一层。为了说明这一点,我们将对3张大小为28x28的图像进行小批量采样,看看当我们通过网络向前传播时会发生什么。
input_image = torch.rand(3,28,28)
打印(input_image.size())
复制代码
火炬。大小([3,28,28])
复制代码
3.1 nn。变平
我们初始化神经网络。展平图层,将每个2D 28x28图像转换为784像素值的连续阵列(保持小批量尺寸(dim=0))。
flatten = nn。展平()
flat_image = flatten(input_image)
print(flat_image.size())
复制代码
火炬。大小([3,784])
复制代码
3.2 nn。线性的
线性图层使用输入的权重和偏差对输入进行线性变换。
layer1 = nn。线性(输入特征=28*28,输出特征=20)
hidden1 =图层1(flat_image)
print(hidden1.size())
复制代码
火炬。大小([3,20])
复制代码
3.3 nn。线性单元
激活是在模型的输入和输出之间创建复杂映射的原因。线性变换后,他们引入非线性变换,帮助神经网络学习各种现象。
在这个模型中,我们使用神经网络。线性层之间的ReLU,但是还有其他激活可以将非线性引入模型。
print(ReLU之前的f:{ hidden 1 } \ n \ n ")
hidden1 = nn。ReLU()(hidden1)
打印(ReLU之后的f:{ hidden 1 } ")
复制代码
ReLU之前:张量([[-2.8178e-01,-1.9056e-01,-4.2242e-01,8.7314e-01,1.2661e-01,
-2.3324e-02,-4.4453e-01,-6.5368e-01,1.0900e-02,-9.2943e-02,
-5.4586e-01,1.0089e-01,-4.7385e-02,-2.0129e-01,-1.8159e-01,
2.3144e-01,1.1471e-01,-3.1626e-01,2.5034e-01,-1.9407e-01],
[ 3.5672e-02,1.6900e-01,-9.7982e-02,4.9019e-01,6.8456e-02,
-2.2985e-02,-4.1181e-01,-2.0627e-01,6.6514e-02,-2.0231e-01,
-4.0097e-01,4.0099e-02,4.0609e-03,2.6897e-01,-8.6034e-02,
7.1209e-02,3.4773e-02,-1.3827e-01,1.3006e-01,-1.8710e-01],
[-2.2436e-01,-9.2731e-02,-2.0311e-01,8.1353e-01,2.7119e-01,
-1.2389e-01,-6.8425e-01,-4.3364e-01,1.6657e-01,1.0768e-01,
-5.7534e-01,5.1125e-01,-9.5867e-02,5.6160e-04,3.0365e-01,
4.6523e-01,1.4591e-03,-2.4904e-02,-1.4773e-01,-1.9605e-01]],
grad_fn=)

ReLU之后:张量([[0.0000e+00,0.0000e+00,0.0000e+00,8.7314e-01,1.2661e-01,0.0000e+00,
0.0000e+00,0.0000e+00,1.0900e-02,0.0000e+00,0.0000e+00,1.0089e-01,
0.0000e+00,0.0000e+00,0.0000e+00,2.3144e-01,1.1471e-01,0.0000e+00,
2.5034e-01,0.0000e+00],
[3.5672e-02,1.6900e-01,0.0000e+00,4.9019e-01,6.8456e-02,0.0000e+00,
0.0000e+00,0.0000e+00,6.6514e-02,0.0000e+00,0.0000e+00,4.0099e-02,
4.0609e-03,2.6897e-01,0.0000e+00,7.1209e-02,3.4773e-02,0.0000e+00,
1.3006e-01,0.0000e+00],
[0.0000e+00,0.0000e+00,0.0000e+00,8.1353e-01,2.7119e-01,0.0000e+00,
0.0000e+00,0.0000e+00,1.6657e-01,1.0768e-01,0.0000e+00,5.1125e-01,
0.0000e+00,5.6160e-04,3.0365e-01,4.6523e-01,1.4591e-03,0.0000e+00,
0.0000e+00,0.0000e+00]],grad_fn=)
复制代码
3.4 nn。连续的
Nn。Sequential是一个有序的模块容器。数据按照定义的顺序通过所有模块。您可以使用顺序容器来组装快速网络,例如seq_modules。
序列模块= nn。顺序(
变平,
第一层,
nn。ReLU(),
nn。线性(20,10)
)
input_image = torch.rand(3,28,28)
logits =序列模块(输入图像)
复制代码
3.5 nn。Softmax
神经网络的最后一个线性层返回logits原始值的范围是[-infty,infty]-并传递给nn。Softmax模块。TS将值缩放到[0,1]的区间,表示模型对每个类别的预测概率。dim参数表示其值总和必须为1的尺寸。
softmax = nn。Softmax(dim=1)
pred _ probe = soft max(logits)
复制代码
4.模型参数
神经网络中的许多层是参数化的,即在训练期间优化的相关权重和偏差。子类nn。模块化会自动跟踪模型对象中定义的所有字段,通过使用模型的parameters()或named_parameters()方法访问所有参数。
在这个例子中,我们遍历每个参数并打印其大小和值的预览。
打印(f "模型结构:{模型}\n\n ")

对于名称,model.named_parameters()中的参数:
print(f " Layer:{ name } | Size:{ param . Size()} | Values:{ param[:2]} \ n ")
复制代码
模型结构:神经网络(
(flatten): Flatten(start_dim=1,end_dim=-1)
(linear_relu_stack):顺序(
(0):线性(输入特征=784,输出特征=512,偏差=真)
(1): ReLU()
(2):线性(输入特征=512,输出特征=512,偏差=真)
(3): ReLU()
(4):线性(输入特征=512,输出特征=10,偏差=真)
)
)

layer:linear _ relu _ stack . 0 . weight | Size:torch。大小([512,784]) |值:张量([[-0.0141,-0.0063,0.0096,…, -0.0356, -0.0350, 0.0024],
[ 0.0061, -0.0039, 0.0248, …, -0.0206, -0.0082, 0.0338]],
device='cuda:0 ',grad_fn=)

layer:linear _ relu _ stack . 0 . bias | Size:torch。大小([512]) |值:张量([0.0041,0.0091),设备='cuda:0 ',grad_fn=)

层:linear _ relu _ stack . 2 . weight | Size:torch。大小([512,512]) |值:张量([[-0.0261,-0.0256,-0.0284,…, 0.0257, 0.0216, -0.0032],
[-0.0419, 0.0007, -0.0021, …, -0.0327, 0.0298, 0.0193]],
device='cuda:0 ',grad_fn=)

layer:linear _ relu _ stack . 2 . bias | Size:torch。大小([512]) |值:张量([0.0280,0.0200),设备='cuda:0 ',grad_fn=)

层:linear _ relu _ stack . 4 . weight | Size:torch。大小([10,512]) |值:张量([[-2.6175e-02,1.3856e-03,-8.3709e-05,…,-7.1290e-03,
3.2877e-02,1.9994e-02],
[-5.5316e-04,1.1257e-02,-2.5447e-02,…,3.3785e-02,
1.1102e-02,-1.8905e-02]],device='cuda:0 ',grad_fn=)

layer:linear _ relu _ stack . 4 . bias | Size:torch。size([10])| Values:tensor([-0.0314,0.0086),device='cuda:0 ',gra