TensorFlow 教程:6. bp神经网络 实现手写字符识别

前言:

通过之前的教程,我们知道 机器学习 就是对 数据进行分类。 分类的方式就是求出一系列参数(权重)。 通过权重来实现对输入值的分类。

所以本章我们会用 bp 实现一个对手写字符的识别。

首先:

我们会导入一个数据集。数据集内有 1797个 0到9的手写字符。 每个手写字符的图像如下:

《TensorFlow 教程:6. bp神经网络 实现手写字符识别》

字符集 对每个字符的存储方式是 获取每个点的像素。 存储格式是: 第一行数据 +第二行数据 ····· 这里是一个64为长

其次 : 有了图片之后 我们就去pb算法去进行分类,求出这个权值。

把下面 的代码跑通, 然后自己进行调试,去映照之前几篇的思路。 本篇没有什么新的东西要将。主要就是深入一下

代码如下:

注意 如果跑不同 请去第一篇 看是否使用的是同一个环境。 以我的环境为主

   # coding: utf-8

#本篇教程 学习资料来源
# Github:https://github.com/Qinbf


# In[3]:

import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.cross_validation import train_test_split


def sigmoid(x):
	return 1 / (1 + np.exp(-x))


def dsigmoid(x):
	return x * (1 - x)


class NeuralNetwork:
	def __init__(self, layers):  # (64,100,10)
		# 权值的初始化,范围-1到1
		self.V = np.random.random((layers[0] + 1, layers[1] + 1)) * 2 - 1
		self.W = np.random.random((layers[1] + 1, layers[2])) * 2 - 1

	def train(self, X, y, lr=0.11, epochs=10000):
		# 添加偏置
		temp = np.ones([X.shape[0], X.shape[1] + 1])
		temp[:, 0:-1] = X
		X = temp

		for n in range(epochs + 1):
			i = np.random.randint(X.shape[0])  # 随机选取一个数据
			x = [X[i]]
			x = np.atleast_2d(x)  # 转为2维数据

			L1 = sigmoid(np.dot(x, self.V))  # 隐层输出
			L2 = sigmoid(np.dot(L1, self.W))  # 输出层输出

			L2_delta = (y[i] - L2) * dsigmoid(L2)
			L1_delta = L2_delta.dot(self.W.T) * dsigmoid(L1)

			self.W += lr * L1.T.dot(L2_delta)
			self.V += lr * x.T.dot(L1_delta)

			# 每训练1000次预测一次准确率
			if n % 1000 == 0:
				predictions = []
				for j in range(X_test.shape[0]):
					o = self.predict(X_test[j])
					predictions.append(np.argmax(o))  # 获取预测结果
				accuracy = np.mean(np.equal(predictions, y_test))
				print('epoch:', n, 'accuracy:', accuracy)

	def predict(self, x):
		# 添加偏置
		temp = np.ones(x.shape[0] + 1)
		temp[0:-1] = x
		x = temp
		x = np.atleast_2d(x)  # 转为2维数据

		L1 = sigmoid(np.dot(x, self.V))  # 隐层输出
		L2 = sigmoid(np.dot(L1, self.W))  # 输出层输出
		return L2


digits = load_digits()  # 载入数据
X = digits.data  # 数据
y = digits.target  # 标签
# 输入数据归一化
X -= X.min()
X /= X.max()

nm = NeuralNetwork([64, 100, 10])  # 创建网络

X_train, X_test, y_train, y_test = train_test_split(X, y)  # 分割数据1/4为测试数据,3/4为训练数据

labels_train = LabelBinarizer().fit_transform(y_train)  # 标签二值化 0,8,6 0->1000000000 3->0001000000
labels_test = LabelBinarizer().fit_transform(y_test)  # 标签二值化

print('start')

nm.train(X_train, labels_train, epochs=20000)

print('end')

    原文作者:羽一
    原文地址: https://zhuanlan.zhihu.com/p/32685335
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞