import torch
import numpy as np

# 创建数据集: 每个样本有14个特征
x_train = np.array([
    [0.5, -1.2, 0.3, 0.8, 1.0, -0.5, 2.3, 1.2, -0.3, 1.5, -1.1, 0.6, -0.8, 0.7],
    [1.5,  2.2, 1.3, -0.7, 1.1,  0.5, -1.3, 0.4,  1.2, 0.8,  0.3, 0.6,  2.1, 0.2],
    [0.9, -0.2, -0.5, -1.2, 1.3, -1.1, 0.7,  1.5,  0.9, 1.0, -0.4, 0.5, -1.0, 1.4],
    [-0.4, 0.8, 1.2, -0.1, 1.5, 0.2, 0.6, -1.3, 1.0, 1.3, 0.3, -0.9, 1.1, 0.5],
    [1.0, 0.2, -1.4, 0.3, -0.7, 1.1, -0.1, 0.5, 0.6, 1.5, 0.7, -0.5, 0.9, -0.2]
], dtype=np.float32)

y_train = np.array([[5.0], [6.0], [4.0], [7.0], [3.0]], dtype=np.float32)



input_size = 14  #输入层神经元个数
hidden_size = 128 #隐藏层神经元个数
output_size = 1  #输出层神经元个数
batch_size = 16
my_nn = torch.nn.Sequential(
    torch.nn.Linear(input_size,hidden_size),
    torch.nn.Sigmoid(),
    torch.nn.Linear(hidden_size,output_size)
)
cost = torch.nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(my_nn.parameters(),lr=0.001)


#训练网络
losses=[]
for i in range(1000):
    batch_loss=[]
    # 分批训练
    for start in range(0,x_train.shape[0],batch_size):
        end = start + batch_size if start+batch_size<x_train.shape[0] else len(x_train)  #开始的位置每次跳16个步长,结束的位置为开始位置+16,特判有没有超越界限
        xx = torch.tensor(x_train[start:end],dtype=torch.float32,requires_grad=True)
        yy = torch.tensor(y_train[start:end],dtype=torch.float32,requires_grad=True)

        # 前向传播不需要自己一个矩阵一个矩阵相乘了,可以直接输入到my_nn中
        prediction = my_nn(xx)
        loss = cost(prediction,yy)  # 损失函数
        loss.backward(retain_graph=True) # 反向求导
        optimizer.step() # 更新参数
        optimizer.zero_grad()
        batch_loss.append(loss.detach().numpy())
    if i %100==0:
        losses.append(np.mean(batch_loss))
        print(i,np.mean(batch_loss))


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐