1维CNN样例程序

基于pytorch实现的1维CNN样例程序,可以参考进行修改

import torch 
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as data
import numpy as np
import time
from torch.nn import init
# =================================初始化参数===================================
INPUT_SIZE = 50000  #输入维数
NUM_CLASS = 256  #分类数
NUM_EPOCH = 100  #迭代轮数
BATCH_SIZE = 200  #batch大小
lr = 0.00001    #学习率

USE_CUDA = torch.cuda.is_available()

# =================================模型定义===================================
# 使用TrainData类来进行数据输入
class TrainData(data.Dataset):
  def __init__(self, label, input_data):  
    super(TrainData, self).__init__()  #
    self.label = torch.LongTensor(label) 
    self.input_data = torch.Tensor(input_data)

  def __len__(self):
    return len(self.label)

  def __getitem__(self, index):
    # 定义获取每个input及label的形式,此处需要根据你数据来调整维度。要不会报错
    data = self.input_data[index] 
    data = data.unsqueeze(0) #我这个是针对一维数据来使用,所以需要扩展维度
    label = self.label[index]    
    return data, label


# 定义网络,自己按照我这种模块化进行编写,如果遇到不会的、不懂得参考pytorch的官方文档 https://pytorch.org/docs/stable/index.html
class Net(nn.Module):
  def __init__(self):
    super(Net, self).__init__()
    # Conv1d是一维卷积层
    # AvgPool1d是一维平均池化层
    self.layer1 = nn.Sequential(
          nn.Conv1d(1, 64, 11),
          nn.ReLU(),
          nn.AvgPool1d(2, 2)
    )
    self.layer2 = nn.Sequential(
          nn.Conv1d(64, 128, 11),
          nn.ReLU(),
          nn.AvgPool1d(2, 2)
    )
    self.layer3 = nn.Sequential(
          nn.Conv1d(128, 256, 11),# w = (256,128,11) b = 256  param = 360704
          nn.ReLU(),
          nn.AvgPool1d(2, 2)
    )
    self.layer4 = nn.Sequential(
          nn.Conv1d(256, 512, 11),# w = (512,256,11) b = 512  param = 1442304
          nn.ReLU(),
          nn.AvgPool1d(2, 2)
    )
    self.layer5 = nn.Sequential(
          nn.Conv1d(512, 512, 11),# w = (512,512,11) b = 512  param = 2884096
          nn.ReLU(),
          nn.AvgPool1d(2, 2)
    )
    # 展平层
    self.fn = nn.Flatten()
    self.fc = nn.Sequential(
        # 全连接层,如果是mlp,那么去掉前面的卷积部分,从这部分开始是全连接层
        nn.Linear(6144, 4096),# 6144是输入的数据长度(点数),4096是神经元个数
        nn.ReLU(),
        nn.Linear(4096, 4096),
        nn.ReLU(),
        nn.Linear(4096, 256)
    )
  # forward定义了数据正向传播过程
  def forward(self, x):
    out = self.layer1(x)
    out = self.layer2(out)
    out = self.layer3(out)
    out = self.layer4(out)
    out = self.layer5(out)
    out = self.fn(out)
    out = self.fc(out)
    return out        


# =================================数据加载===================================
t_d = np.loadtxt("") # 训练集数据
t_l = np.loadtxt("") # 训练集标签

dataset = TrainData(t_l, t_d)
dataloader = data.DataLoader(dataset, batch_size = BATCH_SIZE , shuffle = True, num_workers = 0)  # 通过dataloader来加载数据,shuffle:数据打乱

net = Net() 
print(net)
if USE_CUDA:
  net = net.cuda()
# =================================训练参数===================================
# 使用的损失函数为CrossEntropyLoss,你可以根据需要换为MSELoss,梯度下降选择的算法为RMSprop
optimizer = torch.optim.RMSprop(net.parameters(), lr=lr)
loss_func = nn.CrossEntropyLoss()

# 记录训练集loss
crossentropy = []

minloss = 10

# =================================模型训练===================================
start = time.clock()
for epoch in tqdm.notebook.tqdm(range(NUM_EPOCH)):
  for i,(t,h) in enumerate(dataloader):
    if USE_CUDA:
      t = t.cuda()
      h = h.cuda()
    
    h_pred = net(t)
    
    loss = loss_func(h_pred, h)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if loss < minloss:
        minloss = loss
        # 存储模型的参数
        torch.save(net.state_dict(), 'CNN_net_params.pkl')
    if i%100 == 0:
      print('Epoch:',epoch, loss.item())
  crossentropy.append(loss)

end = time.clock()
print(end-start)

# =================================模型测试===================================
v_d = np.loadtxt("") # 加载测试数据
v_net = Net()

if USE_CUDA:
    v_net = v_net.cuda()
    v_d = v_d.cuda()
# 将之前训练好的模型参数加载
v_net.load_state_dict(torch.load('CNN_net_params.pkl'))
with torch.no_grad():
    predictions = v_net(v_p.unsqueeze(1))

# 进行预测
predictions = np.array(F.softmax(predictions.cpu(),dim = 1))

# 剩下你自由发挥。可以取出每个测试数据对应预测结果中概率最大的作为预测结果
posted @ 2021-08-10 11:34  AIRJK  阅读(207)  评论(0)    收藏  举报