手写字识别代码

import numpy as np
import torch
from torchvision.datasets import mnist#导入pytorch内置的mnist数据
from torch import nn
from torch.autograd import Variable

#使用内置函数下载mnist数据集
train_set=mnist.MNIST('./data',train=True,download=True)
test_set=mnist.MNIST('./data',train=False,download=True)

a_data,a_label=train_set[0]
a_data

a_label

#转换成numpy array格式
a_data=np.array(a_data,dtype='float32')
print(a_data.shape)

print(a_data)

#对于神经网络,我们第一层的输入就是28*28=784,所以必须用reshape将其拉成一个一维数组
def data_tf(x):
    x=np.array(x,dtype='float32')/255
    x=(x-0.5)/0.5#标准化
    x=x.reshape((-1,))#拉平
    x=torch.from_numpy(x)
    return x
#重新载入数据集,申明定义的数据变换
train_set=mnist.MNIST('./data',train=True,transform=data_tf,download=True)
test_set=mnist.MNIST('./data',train=False,transform=data_tf,download=True)

a,a_label=train_set[0]
print(a.shape)
print(a_label)

#使用pytorch自带的DataLoader定义一个数据迭代器
from torch.utils.data import DataLoader
train_data=DataLoader(train_set,batch_size=64,shuffle=True)
test_data=DataLoader(test_set,batch_size=128,shuffle=False)
#由于数据量太大,无法一次全部读入内存,所以需要使用python迭代器,每次生成一个批次的数据
a,a_label=next(iter(train_data))
#打印出一个批次的数据大小
print(a.shape)
print(a_label.shape)

#使用Sequential定义4层神经网络
net=nn.Sequential(
    nn.Linear(784,400),
    nn.ReLU(),
    nn.Linear(400,200),
    nn.ReLU(),
    nn.Linear(200,100),
    nn.ReLU(),
    nn.Linear(100,10)
)
net

#定义loss函数,采用的是交叉熵损失函数
criterion=nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(net.parameters(),1e-1)#使用梯度下降,学习率0.1

#开始训练
losses=[]
acces=[]
eval_losses=[]
eval_acces=[]
for e in range(20):
    train_loss=0
    train_acc=0
    net.train()
    for im,label in train_data:
        im=Variable(im)
        label=Variable(label)
        #向前传播
        out=net(im)
        loss=criterion(out,label)
        #反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        #记录误差
        train_loss+=loss.item()
        #计算分类的准确率
        _,pred=out.max(1)
        num_correct=(pred==label).sum().item()
        acc=num_correct/im.shape[0]
        train_acc+=acc
    losses.append(train_loss/len(train_data))
    acces.append(train_acc/len(train_data))
    #在测试集上检验效果
    eval_loss=0
    eval_acc=0
    net.eval()#将模型改为预测模型
    for im, label in test_data:
        im=Variable(im)
        label=Variable(label)
        out=net(im)
        loss=criterion(out,label)
        #记录误差
        eval_loss+=loss.item()
        #记录准确率
        _,pred=out.max(1) 
        num_correct=(pred==label).sum().item()
        acc=num_correct/im.shape[0]
        eval_acc+=acc
    eval_losses.append(eval_loss/len(test_data))
    eval_acces.append(eval_acc/len(test_data))
    print('epoch:{},Train Loss:{:.6f},Train Acc:{:.6f},Eval Loss:{:.6f},Eval Acc:{:.6f}'.format(e,train_loss/len(train_data),train_acc/len(train_data),eval_loss/len(test_data),eval_acc/len(test_data)))

#画出loss曲线和准确率曲线
import matplotlib.pyplot as plt
%matplotlib inline
plt.title('train loss')
plt.plot(np.arange(len(losses)),losses)
plt.title('train acc')
plt.plot(np.arange(len(acces)),acces)
plt.title('test loss')
plt.plot(np.arange(len(eval_losses)),eval_losses)
plt.title('test acc')
plt.plot(np.arange(len(eval_acces)),eval_acces)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,手写识别是一个经典的机器学习问题,可以使用各种算法来解决,比如传统的机器学习算法和深度学习算法。下面给您提供一个基于深度学习算法的手写识别代码,基于Python和TensorFlow框架实现。 ```python import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data # 加载数据集 mnist = input_data.read_data_sets("MNIST_data", one_hot=True) # 定义超参数 learning_rate = 0.001 training_epochs = 15 batch_size = 100 display_step = 1 # 定义网络参数 n_input = 784 # 输入层大小(28*28) n_hidden_1 = 256 # 隐藏层1大小 n_hidden_2 = 256 # 隐藏层2大小 n_classes = 10 # 输出层大小(0-9) # 定义输入输出占位符 x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float", [None, n_classes]) # 定义权重和偏置变量 weights = { 'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes])) } biases = { 'b1': tf.Variable(tf.random_normal([n_hidden_1])), 'b2': tf.Variable(tf.random_normal([n_hidden_2])), 'out': tf.Variable(tf.random_normal([n_classes])) } # 定义网络结构 def multilayer_perceptron(x, weights, biases): layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) layer_1 = tf.nn.relu(layer_1) layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) layer_2 = tf.nn.relu(layer_2) out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] return out_layer # 构建模型 pred = multilayer_perceptron(x, weights, biases) # 定义损失函数和优化器 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # 初始化变量 init = tf.global_variables_initializer() # 训练模型 with tf.Session() as sess: sess.run(init) for epoch in range(training_epochs): avg_cost = 0. total_batch = int(mnist.train.num_examples/batch_size) for i in range(total_batch): batch_x, batch_y = mnist.train.next_batch(batch_size) _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y}) avg_cost += c / total_batch if epoch % display_step == 0: print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost)) print("Optimization Finished!") # 测试模型 correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels})) ``` 这个代码使用的是多层感知器(Multilayer Perceptron, MLP)模型,可以实现手写识别任务。您可以根据自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值