机器学习实践三---神经网络学习

Neural Networks

在这个练习中,将实现神经网络BP算法,练习的内容是手写数字识别。

Visualizing the data

这次数据还是5000个样本,每个样本是一张20*20的灰度图片
fig, ax_array = plt.subplots(nrows=10, ncols=10, figsize=(6, 4))for row in range(10):for column in range(10):ax_array[row, column].matshow(sample_images[10 * row + column].reshape((20, 20)).T, cmap='gray')ax_array[row, column].axis('off')plt.show()returndata = loadmat("ex4data1.mat")
X = data['X']
y = data['y']m = X.shape[0]
rand_sample_num = np.random.permutation(m)
sample_images = X[rand_sample_num[0:100], :]
display_data(sample_images)

Model representation

这是一个简单的神经网络,输入层、隐藏层、输出,样本图片是20*20,所以输入层是400个单元,(再加上一个额外偏差单元),第二层隐藏层是25个单元, 输出层是10个单元。从上面的数据显示中有两个变量X 和y。
ex4weights.mat 中提供了训练好的网络参数theta1, theta2,
theta1 has size 25 x 401
theta2 has size 10 x 26
在这里插入图片描述

Feedforward and cost function

为了最后的输出,我们将标签值也就是数字从0到9, 转化为one-hot 码

from sklearn.preprocessing import OneHotEncoder
def to_one_hot(y):encoder =  OneHotEncoder(sparse=False)  # return a array instead of matrixy_onehot = encoder.fit_transform(y.reshape(-1,1))return y_onehot

加载数据

X, label_y = load_mat('ex4data1.mat')
X = np.insert(X, 0, 1, axis=1)
y = to_one_hot(label_y)

load weight

def load_weight(path):data = loadmat(path)return data['Theta1'], data['Theta2']t1, t2 = load_weight('ex4weights.mat')

theta 转化
因为opt.minimize传参问题,我们这里对theta进行平坦化

# 展开
def unrool(var1, var2):return np.r_[var1.flatten(), var2.flatten()]
# 分开矩阵化
def rool(array):return array[:25*401].reshape(25, 401), array[25*401:].reshape(10, 26)

Feedforward Regularized cost function

这里主要是前馈传播 和 代价函数的一些逻辑,正则化为了预防高方差问题。

def sigmoid(z):return 1 / (1 + np.exp(-z))#前馈传播
def feed_forward(theta, X):theta1, theta2 = rool(theta)a1 = Xz2 = a1.dot(theta1.T)a2 = np.insert(sigmoid(z2), 0, 1, axis=1)z3 = a2.dot(theta2.T)a3 = sigmoid(z3)return a1, z2, a2, z3, a3# a1, z2, a2, z3, h = feed_forward(t1, t2, X)def cost(theta, X, y):a1, z2, a2, z3, h = feed_forward(theta, X)J = -y * np.log(h) - (1-y) * np.log(1 - h)return J# Implement Regularization
def regularized_cost(theta, X, y, l=1):theta1, theta2 = rool(theta)temp_theta1 = theta1[:, 1:]temp_theta2 = theta2[:, 1:]reg = temp_theta1.flatten().T.dot(temp_theta1.flatten()) + temp_theta2.flatten().T.dot(temp_theta2.flatten())regularized_theta = l / (2 * len(X)) * reg return regularized_theta + cost(theta, X, y)

Backprogation

反向传播算法,是机器学习比较难推理的算法了, 也是最重要的算法,为了得到最优的theta值, 通过进行反向传播,来不断跟新theta值, 当然还有一些超参数,如lambda、a 、训练迭代次数,如果进行adam、Rmsprop等优化学习效率算法,还有有一些其他的超参数。


# random initalization# 梯度
def gradient(theta, X, y):theta1, theta2 = rool(theta)a1, z2, a2, z3, h = feed_forward(theta, X)d3 = h - yd2 = d3.dot(theta2[:, 1:]) * sigmoid_gradient(z2)D2 = d3.T.dot(a2)D1 = d2.T.dot(a1)D = (1 / len(X)) * unrool(D1, D2)return D

Sigmoid gradient

也就是对sigmoid 函数求导

def sigmoid_gradient(z):return sigmoid(z) * (1 - sigmoid(z))

Random initialization

初始化参数,我们一般使用随机初始化np.random.randn(-2,2),生成高斯分布,再乘以一个小的数,这样把它初始化为很小的随机数,
这样直观地看就相当于把训练放在了逻辑回归的直线部分进行开始,初始化参数还可以尽量避免梯度消失和梯度爆炸的问题。

def random_init(size):return np.random.randn(-2, 2, size) * 0.01

Backporpagation

Regularized Neural Networks

正则化神经网络

def regularized_gradient(theta, X, y, l=1):a1, z2, a2, z3, h = feed_forward(theta, X)D1, D2 = rool(gradient(theta, X, y))t1[:, 0] = 0t2[:, 0] = 0reg_D1 = D1 + (l / len(X)) * t1reg_D2 = D2 + (l / len(X)) * t2return unrool(reg_D1, reg_D2)

Learning parameters using fmincg

调优参数

def nn_training(X, y):init_theta = random_init(10285)  # 25*401 + 10*26res = opt.minimize(fun=regularized_cost,x0=init_theta,args=(X, y, 1),method='TNC',jac=regularized_gradient,options={'maxiter': 400})return resres = nn_training(X, y)

准确率
def accuracy(theta, X, y):
_, _, _, _, h = feed_forward(res.x, X)
y_pred = np.argmax(h, axis=1) + 1
print(classification_report(y, y_pred))

accuracy(res.x, X, label_y)

Visualizing the hidden layer

隐藏层显示跟输入层显示差不多

def plot_hidden(theta):t1, _ = rool(theta)t1 = t1[:, 1:]fig, ax_array = plt.subplots(5, 5, sharex=True, sharey=True, figsize=(6, 6))for r in range(5):for c in range(5):ax_array[r, c].matshow(t1[r * 5 + c].reshape(20, 20), cmap='gray_r')plt.xticks([])plt.yticks([])plt.show()plot_hidden(res.x)

super parameter lambda update

神经网络是非常强大的模型,可以形成高度复杂的决策边界。如果没有正则化,神经网络就有可能“过度拟合”一个训练集,从而使它在训练集上获得接近100%的准确性,但在以前没有见过的新例子上则不会。你可以设置较小的正则化λ值和MaxIter参数高的迭代次数为自己看到这个结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Expression Blend 2 密钥,key

Microsoft Expression Blend 2 密钥,key,序列TJ2R3-WHW22-B848T-B78YJ-HHJWJ号

ethereumjs/ethereumjs-common-3-test

查看test能够让你更好滴了解其API文档的使用 ethereumjs-common/tests/chains.js const tape require(tape) const Common require(../index.js)tape([Common]: Initialization / Chain params, function (t) {t.test(Should initialize with chain provided, function (st) …

mysql修改_mysql修改表操作

一: 修改表信息1.修改表名alter table test_a rename to sys_app;2.修改表注释alter table sys_application comment 系统信息表;二:修改字段信息1.修改字段类型和注释alter table sys_application modify column app_name varchar(20) COMMENT 应用的名…

机器学习实践四--正则化线性回归 和 偏差vs方差

这次实践的前半部分是,用水库水位的变化,来预测大坝的出水量。 给数据集拟合一条直线,可能得到一个逻辑回归拟合,但它并不能很好地拟合数据,这是高偏差(high bias)的情况,也称为“欠…

深度学习 推理 训练_使用关系推理的自我监督学习进行训练而无需标记数据

深度学习 推理 训练背景与挑战📋 (Background and challenges 📋) In a modern deep learning algorithm, the dependence on manual annotation of unlabeled data is one of the major limitations. To train a good model, usually, we have to prepa…

Android strings.xml中定义字符串显示空格

<string name"str">字 符 串</string> 其中 就表示空格。如果直接在里面键入空格&#xff0c;无论多少空格都只会显示一个。 用的XML转义字符记录如下&#xff1a; 空格&#xff1a; <string name"out_bound_submit">出 库</strin…

WCF开发入门的六个步骤

在这里我就用一个据于一个简单的场景&#xff1a;服务端为客服端提供获取客户信息的一个接口读取客户信息&#xff0c;来完成WCF开发入门的六个步骤。 1. 定义WCF服务契约 A. 项目引用节点右键添加引用。 B. 在代码文件里&#xff0c;添加以下命名空间的引…

LOJ116 有源汇有上下界最大流(上下界网络流)

考虑有源汇上下界可行流&#xff1a;由汇向源连inf边&#xff0c;那么变成无源汇图&#xff0c;按上题做法跑出可行流。此时该inf边的流量即为原图中该可行流的流量。因为可以假装把加上去的那些边的流量放回原图。 此时再从原来的源向原来的汇跑最大流。超源超汇相关的边已经流…

CentOS 7 使用 ACL 设置文件权限

Linux 系统标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限&#xff0c;所以 ACL 便被引入了进来&#xff0c;为的是为文件和目录定义更加详细的访问权限&#xff0c;而不仅仅是这些特别指定的特定权限。 ACL 可以为每个用户&#xff0c;每个组或不在文件所属组中的用…

机器学习实践五---支持向量机(SVM)

之前已经学到了很多监督学习算法&#xff0c; 今天的监督学习算法是支持向量机&#xff0c;与逻辑回归和神经网络算法相比&#xff0c;它在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更强大的方式。 Support Vector Machines SVM hypothesis Example Dataset 1…

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观 但是它却是我们开发分布式程序的利器 但是目前关于WCF方面的资料相当稀少 希望我的这一系列文章可以帮助大家尽快入门 下面先介绍一下我的开发环境吧 操作系统&#xff1a;windows vista business版本 编译器…

服务器安装mysql_阿里云服务器上安装MySQL

关闭防火墙和selinuxCentOS7以下&#xff1a;service iptables stopsetenforce 0CentOS7.xsystemctl stop firewalldsystemctl disable firewalldsystemctl status firewalldvi /etc/selinux/config把SELINUXenforcing 改成 SELINUXdisabled一、安装依赖库yum -y install make …

在PyTorch中转换数据

In continuation of my previous post ,we will keep on deep diving into basic fundamentals of PyTorch. In this post we will discuss about ways to transform data in PyTorch.延续我以前的 发布后 &#xff0c;我们将继续深入研究PyTorch的基本原理。 在这篇文章中&a…

「网络流24题」试题库问题

传送门&#xff1a;>Here< 题意&#xff1a;有K种类型的共N道试题用来出卷子&#xff0c;要求卷子须有M道试题。已知每道题属于p种类型&#xff0c;每种类型的试题必须有且仅有k[i]道。现问出这套试卷的一种具体方案 思路分析 昨天打了一天的Dinic&#xff0c;今天又打了…

机器学习实践六---K-means聚类算法 和 主成分分析(PCA)

在这次练习中将实现K-means 聚类算法并应用它压缩图片&#xff0c;第二部分&#xff0c;将使用主成分分析算法去找到一个脸部图片的低维描述。 K-means Clustering Implementing K-means K-means算法是一种自动将相似的数据样本聚在一起的方法,K-means背后的直观是一个迭代过…

航海家软件公式全破解

水手突破 上趋势:MA(LOW,20)*1.2,color0080ff,linethick2;次上趋势:MA(LOW,20)*1.1,COLORYELLOW;次下趋势:MA(HIGH,20)*0.9,COLORWHITE;下趋势:MA(HIGH,20)*0.8,COLORGREEN,linethick2;ZD:(C-REF(C,1))/REF(C,1)*100;HDZF:(HHV(H,20)-C)/(HHV(H,20)-LLV(L,20));趋势强度:IF(C&g…

打包 压缩 命令tar zip

2019独角兽企业重金招聘Python工程师标准>>> 打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***.tar.gz tar -xjvf ***.tar.bz2 tar [主选项辅选项] 文件或目录 主选项是必须要有的&#xff0c;它告诉tar要做…

mysql免安装5.7.17_mysql免安装5.7.17数据库配置

首先要有 mysql-5.7.10-winx64环境: mysql-5.7.10-winx64 win10(64位)配置环境变量&#xff1a;1、把mysql-5.7.10-winx64放到D盘&#xff0c;进入D\mysql-5.7.10-winx64\bin目录&#xff0c;复制路径&#xff0c;配置环境变量&#xff0c;在path后面添加D\mysql-5.7.10-winx6…

tidb数据库_异构数据库复制到TiDB

tidb数据库This article is based on a talk given by Tianshuang Qin at TiDB DevCon 2020.本文基于Tianshuang Qin在 TiDB DevCon 2020 上的演讲 。 When we convert from a standalone system to a distributed one, one of the challenges is migrating the database. We’…

机器学习实践七----异常检测和推荐系统

Anomaly detection 异常检测是机器学习中比较常见的应用&#xff0c;它主要用于非监督学习问题&#xff0c;从某些角度看&#xff0c; 它又类似于一些监督学习问题。 什么是异常检测&#xff1f;来看几个例子&#xff1a; 例1. 假设是飞机引擎制造商&#xff0c; 要对引擎进行…