当前位置:   article > 正文

头歌工程实训答案-机器学习篇之手写体识别篇_头歌手写体识别答案

头歌手写体识别答案

第2关:激活函数

#encoding=utf8

def relu(x):

    '''

    x:负无穷到正无穷的实数

    '''

    #********* Begin *********#

    if x<=0:

        return 0

    else:

        return x

    #***

****** End *********#

第3关:反向传播算法

#encoding=utf8

import os

import pandas as pd

from sklearn.neural_network import MLPClassifier

if os.path.exists('./step2/result.csv'):

    os.remove('./step2/result.csv')

   

#********* Begin *********#

train_data = pd.read_csv('./step2/train_data.csv')

train_label = pd.read_csv('./step2/train_label.csv')

train_label = train_label['target']

test_data = pd.read_csv('./step2/test_data.csv')

mlp = MLPClassifier(solver='lbfgs',max_iter=30, alpha=1e-4,hidden_layer_sizes=(20, ))

mlp.fit(train_data, train_label)

predict = mlp.predict(test_data)

df = pd.DataFrame({'result':predict})

df.to_csv('./step2/result.csv', index=False)

#********* End *********#

第4关:使用pytorch搭建卷积神经网络识别手写数字

#encoding=utf8

import torch

import torch.nn as nn

from torch.autograd import Variable

import torch.utils.data as Data

import torchvision

import os

if os.path.exists('./step3/cnn.pkl'):

    os.remove('./step3/cnn.pkl')

   

#加载数据            

train_data = torchvision.datasets.MNIST(

    root='./step3/mnist/',

    train=True,                                     # this is training data

    transform=torchvision.transforms.ToTensor(),    # Converts a PIL.Image or numpy.ndarray to                                                    

    download=False,

)

#取6000个样本为训练集

train_data_tiny = []

for i in range(6000):

    train_data_tiny.append(train_data[i])

train_data = train_data_tiny

#********* Begin *********#

train_loader = Data.DataLoader(

    dataset=train_data,

    batch_size=64,

    num_workers=2,

    shuffle=True

)

# 构建卷积神经网络模型

class CNN(nn.Module):

    def __init__(self):

        super(CNN, self).__init__()

        self.conv1 = nn.Sequential(  # input shape (1, 28, 28)

            nn.Conv2d(

                in_channels=1,  # input height

                out_channels=16,  # n_filters

                kernel_size=5,  # filter size

                stride=1,  # filter movement/step

                padding=2,

                # if want same width and length of this image after con2d, padding=(kernel_size-1)/2 if stride=1

            ),  # output shape (16, 28, 28)

            nn.ReLU(),  # activation

            nn.MaxPool2d(kernel_size=2),  # choose max value in 2x2 area, output shape (16, 14, 14)

        )

        self.conv2 = nn.Sequential(  # input shape (16, 14, 14)

            nn.Conv2d(16, 32, 5, 1, 2),  # output shape (32, 14, 14)

            nn.ReLU(),  # activation

            nn.MaxPool2d(2),  # output shape (32, 7, 7)

        )

        self.out = nn.Linear(32 * 7 * 7, 10)  

    def forward(self, x):

        x = self.conv1(x)

        x = self.conv2(x)

        x = x.view(x.size(0), -1)

        output = self.out(x)

        return output

cnn = CNN()

optimizer = torch.optim.SGD(cnn.parameters(), lr=0.01, momentum=0.9)

loss_func = nn.CrossEntropyLoss()

EPOCH = 3

for e in range(EPOCH):

    for x, y in train_loader:

        batch_x = Variable(x)

        batch_y = Variable(y)

        outputs = cnn(batch_x)

        loss = loss_func(outputs, batch_y)

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()        

             

           

#********* End *********#

#保存模型

torch.save(cnn.state_dict(), './step3/cnn.pkl')

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号