(五)处理多维特征的输入(上)+torch.nn.Linear(8,1)表示什么+代码

目录

 1、普通逻辑回归 一个样本中一条数据有1个特征

2、多维特征:一个样本中一条数据有n个特征(以n=8为例)

计算流程:矩阵乘法

(8,1)表示什么?

3、代码:


 1、普通逻辑回归 一个样本中一条数据有1个特征

 x1(X)->y1

x2(X)->y2

.............

xn->yn

2、多维特征:一个样本中一条数据有n个特征(以n=8为例)

x1(X1 X2...X8)->y1

x2(X1 X2...X8)->y2

........

xn(X1 X2...X8)->yn

计算流程:矩阵乘法

 故代码中修改self.linear=torch.nn.Linear(8,1)

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear=torch.nn.Linear(8,1)
        self.sigmoid=torch.nn.Sigmoid()
    def forward(self,x):
        x=self.sigmoid(self.linear(x))
        return x
model=Model()

(8,1)表示什么?

答:w的维度(8,1)

      或者 x(N,8)的8个特征的输入->y(N,1)的1个特征的输出 ,x、y的列表示特征量。

两层时候:

        假设第一个w(8,2),

则先经过(8,2)的线性变化在经过(2,1)的线性变化就可以得到一个特征输出的y(N,1),8维降成2维,2维降成1维。

目标是找一个8维空间到1维空间的非线性的空间变换,神经网络中,引入sigmoid函数给线性变换增加非线性操作,使得可以拟合相应的非线性的变换。变换的维度和层数决定网络的复杂程度。

中间如何过度8D->2D->1D 还是8D->24D->12D->1D 具体取什么比较好,这就是一个典型的超参数的搜索。一般隐层越多,中间步骤越多,中间神经元越多,模型对非线性变换的学习能力就越强。学习能力强,会学到输入样本中噪声的规律也学到,所以要学的是数据真值本身的规律,所以学习能力太强也不好。

3、代码:

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris

# 加载数据集
iris = load_iris()
print(iris.keys())

# 数据预处理,包括从数据集里区分输入输出,最后把输入输出数据封装成Pytorch期望的Variable格式
X_train= iris['data']  # 特征信息
y_train= iris['target']  # 目标分类

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1=torch.nn.Linear(8,6)
        self.linear2= torch.nn.Linear(6,4)
        self.linear3= torch.nn.Linear(4,1)
        self.sigmoid=torch.nn.Sigmoid()
    def forward(self,x):
        x=self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x
model=Model()
criterion=torch.nn.BCELoss(size_average=True)
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)
px,py = [],[]       # 记录要绘制的数据
for epoch in range(1000):
    y_pred=model(X_train)
    loss=criterion(y_pred-y_train)
    print(epoch,loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # px.append(epoch)
    # py.append(loss.item())
    # 
    # # 每十次迭代绘制训练动态
    # if epoch% 10 == 0:
    #     plt.cla()
    #     plt.plot(px, py, 'r-', lw=1)
    #     plt.text(0, 0, 'Loss=%.4f' % loss.item(), fontdict={'size': 20, 'color': 'red'})
    #     plt.pause(0.1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值