【Python实战】——神经网络识别手写数字（一）

1 探索数据集

1.1 读取并显示数据示例

运行程序：

import numpy as np
import matplotlib.pyplot as plt
image_size = 28 # width and length
num_of_different_labels = 10 #  i.e. 0, 1, 2, 3, ..., 9
image_pixels = image_size * image_size
train_data = np.loadtxt("D:\\mnist_train.csv", delimiter=",")
test_data = np.loadtxt("D:\\mnist_test.csv", delimiter=",")
test_data[:10]#测试集前十行

运行结果：

array([[7., 0., 0., ..., 0., 0., 0.],
[2., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
...,
[9., 0., 0., ..., 0., 0., 0.],
[5., 0., 0., ..., 0., 0., 0.],
[9., 0., 0., ..., 0., 0., 0.]])

1.2 数据集大小

运行程序：

print(test_data.shape)
print(train_data.shape)

运行结果：

(10000, 785)
(60000, 785)

该mnist数据集训练集共10000个数据，有785维，测试集有60000个数据，785维。

1.3 自变量因变量构建

运行程序：

##第一列为预测类别
train_imgs = np.asfarray(train_data[:, 1:]) / 255
test_imgs = np.asfarray(test_data[:, 1:]) / 255
train_labels = np.asfarray(train_data[:, :1])
test_labels = np.asfarray(test_data[:, :1])

1.4 One-hot编码

运行程序

import numpy as np
lable_range = np.arange(10)
for label in range(10):
one_hot = (lable_range==label).astype(int)
print("label: ", label, " in one-hot representation: ", one_hot)

# 将数据集的标签转换为one-hot label
label_range = np.arange(num_of_different_labels)
train_labels_one_hot = (label_range==train_labels).astype(float)
test_labels_one_hot = (label_range==test_labels).astype(float)

1.5 图像数据示例

运行程序：

# 示例
for i in range(10):
img = train_imgs[i].reshape((28,28))
plt.imshow(img, cmap="Greys")
plt.show()

运行结果：

1.6 pickle包保存python对象

运行程序:

import pickle
with open("D:\\pickled_mnist.pkl", "bw") as fh:
data = (train_imgs,
test_imgs,
train_labels,
test_labels)
pickle.dump(data, fh)

2 构建神经网络并训练

2.1 读取pickle文件

运行程序：

import pickle
with open("D:\\19实验\\实验课大作业\\pickled_mnist.pkl", "br") as fh:
train_imgs = data[0]
test_imgs = data[1]
train_labels = data[2]
test_labels = data[3]
train_labels_one_hot = (lable_range==train_labels).astype(float)
test_labels_one_hot = (label_range==test_labels).astype(float)
image_size = 28 # width and length
num_of_different_labels = 10 #  i.e. 0, 1, 2, 3, ..., 9
image_pixels = image_size * image_size

2.2 神经网络核心关键函数定义

运行程序：

import numpy as np
def sigmoid(x):
return 1 / (1 + np.e ** -x)
##激活函数
activation_function = sigmoid
from scipy.stats import truncnorm
##数据标准化
def truncated_normal(mean=0, sd=1, low=0, upp=10):
return truncnorm((low - mean) / sd,
(upp - mean) / sd,
loc=mean,
scale=sd)
##构建神经网络模型
class NeuralNetwork:

def __init__(self,
num_of_in_nodes, #输入节点数
num_of_out_nodes, #输出节点数
num_of_hidden_nodes,#隐藏节点数
learning_rate):#学习率
self.num_of_in_nodes = num_of_in_nodes
self.num_of_out_nodes = num_of_out_nodes
self.num_of_hidden_nodes = num_of_hidden_nodes
self.learning_rate = learning_rate
self.create_weight_matrices()
#初始为一个隐藏节点
def create_weight_matrices(self):#创建权重矩阵

# A method to initialize the weight
#matrices of the neural network#一种初始化神经网络权重矩阵的方法
rad = 1 / np.sqrt(self.num_of_in_nodes)
X = truncated_normal(mean=0, sd=1, low=-rad, upp=rad)  #形成指定分布
self.weight_1 = X.rvs((self.num_of_hidden_nodes, self.num_of_in_nodes)) #rvs:产生服从指定分布的随机数

rad = 1 / np.sqrt(self.num_of_hidden_nodes)
self.weight_2 = X.rvs((self.num_of_out_nodes, self.num_of_hidden_nodes)) #rvs: 产生服从指定分布的随机数

def train(self, input_vector, target_vector):
#
# input_vector and target_vector can
#be tuple, list or ndarray
#

input_vector = np.array(input_vector, ndmin=2).T#输入
target_vector = np.array(target_vector, ndmin=2).T#输出

output_vector1 = np.dot(self.weight_1, input_vector) #隐藏层值
output_hidden = activation_function(output_vector1)#删除不激活

output_vector2 = np.dot(self.weight_2, output_hidden)#输出
output_network = activation_function(output_vector2)##删除不激活

# calculate output errors:计算输出误差
output_errors = target_vector - output_network

# update the weights:更新权重
tmp = output_errors * output_network * (1.0 - output_network)
self.weight_2 += self.learning_rate  * np.dot(tmp, output_hidden.T)
# calculate hidden errors:计算隐藏层误差
hidden_errors = np.dot(self.weight_2.T, output_errors)

# update the weights:
tmp = hidden_errors * output_hidden * (1.0 - output_hidden)
self.weight_1 += self.learning_rate * np.dot(tmp, input_vector.T)

#测试集
def run(self, input_vector):
# input_vector can be tuple, list or ndarray
input_vector = np.array(input_vector, ndmin=2).T

output_vector = np.dot(self.weight_1, input_vector)
output_vector = activation_function(output_vector)

output_vector = np.dot(self.weight_2, output_vector)
output_vector = activation_function(output_vector)

return output_vector
#判别矩阵
def confusion_matrix(self, data_array, labels):
cm = np.zeros((10, 10), int)
for i in range(len(data_array)):
res = self.run(data_array[i])
res_max = res.argmax()
target = labels[i][0]
cm[res_max, int(target)] += 1
return cm
#精确度
def precision(self, label, confusion_matrix):
col = confusion_matrix[:, label]
return confusion_matrix[label, label] / col.sum()
#评估
def evaluate(self, data, labels):
corrects, wrongs = 0, 0
for i in range(len(data)):
res = self.run(data[i])
res_max = res.argmax()
if res_max == labels[i]:
corrects += 1
else:
wrongs += 1
return corrects, wrongs

【Python实战】——神经网络识别手写数字（二）+https://developer.aliyun.com/article/1506501

|
21小时前
|
XML 数据库 数据格式
Python网络数据抓取（9）：XPath
Python网络数据抓取（9）：XPath
11 0
|
2天前
|

Python网络爬虫实战：抓取并分析网页数据

53 9
|
2天前
|

25 11
|
3天前
|

Python在金融数据分析中扮演关键角色，用于预测市场趋势和风险管理。本文通过案例展示了使用Python库（如pandas、numpy、matplotlib等）进行数据获取、清洗、分析和建立预测模型，例如计算苹果公司（AAPL）股票的简单移动平均线，以展示基本流程。此示例为更复杂的金融建模奠定了基础。【6月更文挑战第13天】
17 3
|
3天前
|

Python中的并发编程（4）多线程发送网络请求
Python中的并发编程（4）多线程发送网络请求
10 1
|
4天前
|

Python3网络开发实战读后感
Python3网络开发实战读后感
7 2
|
Python
PYTHON实战两数之和
1. 两数之和 难度：简单 收藏 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那 两个 整数，并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
161 0
|
2天前
|
Shell Python
GitHub星标破千Star！Python游戏编程的初学者指南
Python 是一种高级程序设计语言，因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种，与其说是教编程的书，倒不如说是在教“游戏制作软件”，或教授使用一种呆板的语言，使得编程“简单”到不再是编程。而第二种，它们就像是教数学课一样教编程：所有的原理和概念都以小的应用程序的方式呈现给读者。
8 1
|
2天前
|

Python 语言是一种脚本语言，其应用领域非常广泛，包括数据分析、自然语言处理机器学习、科学计算、推荐系统构建等。 能够轻松实现和代码跑得够快之间的取舍却是一个世人皆知且令人惋惜的现象而这个问题其实是可以解决的。 有些人想要让顺序执行的过程跑得更快。有些人需要利用多核架构、集群，或者图形处理单元的优势来解决他们的问题。有些人需要可伸缩系统在保证可靠性的前提下酌情或根据资金多少处理更多或更少的工作。有些人意识到他们的编程技巧，通常是来自其他语言，可能不如别人的自然。
10 1
|
2天前
|

GitHub高赞！速通Python编程基础手册，被玩出花了！

11 2