代码人生的记忆---2018-07-03

# -*- coding: utf-8 -*-

import numpy as np

import torch

import torch.nn as nn

import torch.optim as optim

import torch.nn.functional as F

from torch.optim import lr_scheduler #设置动态调整率

from torch.autograd import Variable

#以上代码导入相应的函数模块和库文件

#准备训练文件

TRAIN_DATA_FILE = 'data/MFCC_train_new'

TEST_DATA_FILE = 'data/MFCC_train_new'

#准备相关参数

MINI_BATCH_SIZE = 50

NUM_ITERATIONS = 10000

PRINT_INTERAL = 10

AE_ITERATIONS = 20000

AE_LOSS = nn.MSELoss()

#构建一个神经网络模型

model = nn.Sequential(

    nn.Linear(2340, 500),

    nn.ReLU(inplace=True),

    nn.Linear(500, 200),

    nn.ReLU(inplace=True),

    nn.Linear(200,10),

    nn.ReLU(inplace=True)

)

#对数据文件进行预处理

def parse_file(file_name, shuffle=True):

    data_raw = []

    labels_raw = []

    with open(file_name) as file:

        lines = file.readlines()  #读取数据,并且自动读取成行的形式

    #以上代码是为了读取文件里的数据

    #下面将对数据进行特征输入和标志输出分离,把他们分别放进不同的元组里

    count = 0

    for line in lines:  #遍历数组中的每一行

        line = line.strip().split(' ')  #去除数据的每一行的左右两边的空格,并且用‘ ’隔开

        if count == 0:

            num_samples, dimensions, num_classes = [int(l) for l in line]

            print('{:s}  has {:d} samples, each of {:d}-dimensions, in {:d} classes'.format(file_name, num_samples, dimensions, num_classes))

        elif count % 2 == 0:

            row = [int(l) for l in line]

            labels_raw.append(row.index(1))  #返回这行数据中1的序列数,即0-9

        else:

            row = [int(l) for l in line]

            data_raw.append(row)

        count += 1

    data_array, labels_array = np.array(data_raw, dtype=np.float32),np.array(labels_raw,dtype=np.int64)

    #下面为了避免数据本身序列对结果的影响,将数据的顺序打乱,使结果更有说服力

    if shuffle:

        indices = np.arange(data_array.shape[0])  #0一般表示取出数据的行数,indices表示从0-19999的数

        np.random.shuffle(indices)  #随机打乱数据的序数

        data_array, labels_array = data_array[indices], labels_array[indices]

        #把打乱后的数据重新送到数组里

    data, labels = torch.from_numpy(data_array), torch.from_numpy(labels_array)

    return data, labels

#下面定义一个数据下载函数

def load_data():

    x_train, y_train = parse_file(TRAIN_DATA_FILE)

    x_test, y_test = parse_file(TEST_DATA_FILE)

    return x_train, y_train, x_test, y_test

#定义批量抽取函数

def sample_mini_batch(data, labels):  #批量梯度下降法MBGD

    indices = np.random.choice(data.size(0), MINI_BATCH_SIZE)

    x_batch = data[indices, :]

    y_batch = labels[indices]

    return x_batch, y_batch

#定义精度计算函数

def evaluate_acc(model, x, y):

    scores = model(Variable(x))

    _, preds = scores.data.max(1)  #表示scores.data.max(1)返回两个最大数的序列号,10个神经元对应0-9个数字号

    #_,表示返回的第一个值不要

    num_corrects = (preds == y).sum()

    num_samples = scores.size(0)  #取样本的行数,相当于取样本个数

    return float(num_corrects) / num_samples

#下面训练一个自编码器

#首先定义一个自编码器的类

class AutoEncoder(nn.Module):

    def __init__(self, input_dim, hidden_dim):

        super(AutoEncoder, self).__init__()

        #首先调用AutoEncoder的父类,即nn.Module,把AutoEncoder的对象self转换为nn.Module的对象

        #然后nn.Module的对象调用自己的__init__函数

    def forward(self, x):

        h_relu = F.relu(self.encoder(x))

        out = self.decoder(h_relu)

        return out, h_relu

    def get_encoder(self):

        return self.encoder.state_dict()['weight'], self.encoder.state_dict()['bias']

#下面定义一个预训练网络模型

def pretrain_model(x_train):

    auto_encoders = []

    for layer in model:

        if type(layer) is nn.Linear:

            input_dim = layer.in _features

            hidden_dim = layer.out_features

            auto_encoders.append(AutoEncoder(input_dim, hidden_dim))

    print(auto_encoders)

    #以上代码把参数传递给AutoEncoder

    for ae_idx in range(len(auto_encoders)):

        print('Training AutoEncoder %d' % ae_idx)

        x_var = x_train.clone()

        for i in range(ae_idx):

            _, x_var = auto_encoders[i](x_var)

        ae = auto_encoders[ae_idx]

        print(ae)

        optimizer = optim.Adam(ae.parameters(), lr=1e-4)

        for i in range(AE_ITERATIONS):

            x_var = Variable(x_var)

            x_ae, _ = ae(x_var)

            optimizer.zero_grad()

            loss = AE_LOSS(x_ae, x_var)

            loss.backward()

            optimizer.step()

            print('Iteration %d, loss = %f' % (i+1, loss))

    ae_idx = 0

    for layer in model:

        if type(layer) is nn.Linear:

            W, b = auto_encoders[ae_idx].get_encoder()

            for name, param in layer.named_parameters():

                print(name)

                print(param.size())

                if 'weight' in name:

                    param.data.copy_(W)

                if 'bias' in name:

                    param.data.copy_(b)

            ae_idx += 1

    return model

#定义训练函数

def train():

    x_train, y_train, x_test, y_test = load_data()

    model = pretrain_model(x_train)

    loss_fn = nn.CrossEntropyLoss()

    optimizer = optim.Adam(model.parameters(), lr=1e-4)

    for t in range(NUM_ITERATIONS):

        x_batch, y_batch = sample_mini_batch(x_train, y_train)

        x_var, y_var = Variable(x_batch), Variable(y_batch)

        scores = model(x_var)

        loss = loss_fn(scores, y_var)

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()

        train_acc = evaluate_acc(model, x_batch, y_batch)

        test_acc = evaluate_acc(model, x_test, y_test)

        if t % PRINT_INTERAL == 0:

            print('Iteration %d: training loss = %f, training accurary = %f, test accurary = %f' % (t+1,loss, train_acc, test_acc))

    final_train_acc = evaluate_acc(model, x_train, y_train)

    final_test_acc = evaluate_acc(model, x_test, y_test)

    print('Final training accurary:{:.4f}, final test accurary:{:.4f}'.format(final_train_acc, final_test_acc))

if __name__ == '__main__':

    train()

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

推荐阅读更多精彩内容