使用 pytorch 构建一维卷积神经网络与数据集

  • 以一维卷积神经网络为例

1 直接使用 numpy 与 tensor 来构建数据集

1.1一维卷积神经网络结构
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv1d(in_channels=1, out_channels=10, kernel_size=3, stride=2)
        self.max_pool1 = nn.MaxPool1d(kernel_size=3, stride=2)
        self.conv2 = nn.Conv1d(10, 20, 3, 2)
        self.max_pool2 = nn.MaxPool1d(3, 2)
        self.conv3 = nn.Conv1d(20, 40, 3, 2)
        
        self.liner1 = nn.Linear(40 * 14, 120)
        self.liner2 = nn.Linear(120, 84)
        self.liner3 = nn.Linear(84, 4) 
        
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.max_pool1(x)
        x = F.relu(self.conv2(x))
        x = self.max_pool2(x)
        x = F.relu(self.conv3(x))
        
        x = x.view(-1, 40 * 14)
        x = F.relu(self.liner1(x))
        x = F.relu(self.liner2(x))
        x = self.liner3(x)
        
        return x
1.2 数据的结构

x_train, x_test, y_train, y_test = train_test_split(dataSet, labels, test_size=0.3, random_state=42)
print( x_train.shape, y_train.shape, x_test.shape, y_test.shape)

out:

((51527, 500), (51527,), (22084, 500), (22084,))
1.3 数据的结构
1.3.1 将 numpy 数据集转化为 tensor
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)
x_test = torch.from_numpy(x_test)
y_test = torch.from_numpy(y_test)
1.3.2 训练集数据类型转化为:tensor.float32
x_train = torch.tensor(x_train, dtype=torch.float32)
x_test = torch.tensor(x_test, dtype=torch.float32)
1.3.3 改变 x_train.shape , x_test.shape 的形状

送入训练的数据格式为:(1, 1, 500)

x_train = x_train.reshape(x_train.shape[0], 1, 1, x_train.shape[1])
x_test = x_test.reshape(x_test.shape[0], 1, x_train.shape[1])
print(x_train.shape, x_test.shape)

out:

(torch.Size([51527, 1, 1, 500]), torch.Size([22084, 1, 500]))
1.3.4 标签的数据格式 与 数据类型
  • 在1.2 节中给出标签的形状:x_train.shape = (51527,) , y_train.shape = (22084,),,类型是:float, 但是训练器需要的是:(51527, 1), (22084, 1) ,dtype=tensor.long
y_train = y_train.reshape(y_train.shape[0], 1)
y_test = y_test.reshape(y_test.shape[0], 1)

y_train = torch.tensor(y_train, dtype=torch.long)
y_test = torch.tensor(y_test, dtype=torch.long)

1.4 开始训练

# 定义损失函数 与 优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
start = time.time()
for epoch in tqdm(range(10)):
    running_loss = 0
    for i, input_data in enumerate(x_train, 0):
        # print(input_data.shape)
        label = y_train[i]
        optimizer.zero_grad()
        
        outputs = net(input_data)
        loss = criterion(outputs, label)
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
        if i % 2000 == 1999:
            print('[%d, %5d] loss: %0.3f' % (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0
print('time = %2dm:%2ds' % ((time.time() - start)//60, (time.time()-start)%60))

2 通过继承 torch.utils.data.Dataset类构建一个数据集

class NuclearDataset(Dataset):
    """ Nuclear Dataset."""

    def __init__(self, data_file, root_dir=None, transform=None):
        """
        Args:
            data_file (string): Path to the data file with annotations.
            root_dir (string): Directory with all the images.
            transform (callable, optional): Optional transform to be applied
                on a sample.
        """
        # self.landmarks_frame = pd.read_csv(csv_file)
        # 加载数据
        self.landmarks_frame = np.load(data_file)
        self.root_dir = root_dir
        self.transform = transform

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

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        # img_name = os.path.join(self.root_dir,self.landmarks_frame.iloc[idx, 0])
        # image = io.imread(img_name)
        # landmarks = self.landmarks_frame.iloc[idx, 1:]
        landmarks = self.landmarks_frame[:, -1]
        landmarks = np.array([landmarks])
        # landmarks = landmarks.astype('float').reshape(-1, 2)
        landmarks = landmarks.astype('float').reshape(-1, 1)
        sample = {'landmarks': landmarks}

        if self.transform:
            sample = self.transform(sample)

        return sample
dataSet实例

标签

同样可以直接定义函数 划分训练集与训练集,比较方便,代码可移植性较好。这其中数据的形状是怎样的,可以按照代码运行的错误提示进行修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容