机器学习实战——基于Scikit-Learn和TensorFlow 阅读笔记 之 第十章:人工神经网络简介_xbs118的博客-程序员宅基地

技术标签: scikitl-learn  人工神经网络  DNN  《机器学习实战——基于Scikit-Learn和TensorFlow》  TensorFlow  机器学习实战  

《机器学习实战——基于Scikit-Learn和TensorFlow》
这是一本非常好的机器学习和深度学习入门书,既有基本理论讲解,也有实战代码示例。
我将认真阅读此书,并为每一章内容做一个知识笔记。
我会摘录一些原书中的关键语句和代码,若有错误请为我指出。

在这里插入图片描述

第十章 人工神经网络简介

1 从生物神经元到人工神经元

兴起的原因:

  • 海量数据
  • 计算能力提升
  • 训练算法提升
  • 理论限制被接受
  • 资金技术良性循环

1.1 生物神经元

。。。。。。

1.2 具有神经元的逻辑计算

与或非们

1.3 感知器

最简单的ANN架构之一。

heabiside和sgn两种阶跃函数。

单层感知器无法解决异或分类问题,可以使用多层感知器解决。

def heaviside(z):
    return (z >= 0).astype(z.dtype)

def mlp_xor(x1, x2, activation=heaviside):
    return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)
    
x1s = np.linspace(-0.2, 1.2, 100)
x2s = np.linspace(-0.2, 1.2, 100)
x1, x2 = np.meshgrid(x1s, x2s)

z1 = mlp_xor(x1, x2, activation=heaviside)
z2 = mlp_xor(x1, x2, activation=sigmoid)

plt.figure(figsize=(10,4))

plt.subplot(121)
plt.contourf(x1, x2, z1)
plt.plot([0, 1], [0, 1], "gs", markersize=20)
plt.plot([0, 1], [1, 0], "y^", markersize=20)
plt.title("Activation function: heaviside", fontsize=14)
plt.grid(True)

plt.subplot(122)
plt.contourf(x1, x2, z2)
plt.plot([0, 1], [0, 1], "gs", markersize=20)
plt.plot([0, 1], [1, 0], "y^", markersize=20)
plt.title("Activation function: sigmoid", fontsize=14)
plt.grid(True)

1.4 多层感知器和反向传播

一个MLP包含一个输入层,一个或多个被成为隐藏层的LTU层,以及一个被称为输出层的LTU组成的最终层。

除了输出层外,没层都包含一个偏移神经元,并且与下一层完全相连。

如果一个ANN有2个以及以上的隐藏层,则别成为深度神经网络(DNN)。

反向传播:略。

阶跃函数替换为逻辑函数,以便反向计算梯度。

2 用TensorFlow的高级API来训练MLP

3 使用纯TensorFlow训练DNN

3.1 构建阶段

def neuron_layer(X, n_neurons, name, activation=None):
    with tf.name_scope(name):
        n_inputs = int(X.get_shape()[1])
        stddev = 2 / np.sqrt(n_inputs)
        init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)
        W = tf.Variable(init, name="kernel")
        b = tf.Variable(tf.zeros([n_neurons]), name="bias")
        Z = tf.matmul(X, W) + b
        if activation is not None:
            return activation(Z)
        else:
            return Z

with tf.name_scope("dnn"):
    hidden1 = neuron_layer(X, n_hidden1, name="hidden1",
                           activation=tf.nn.relu)
    hidden2 = neuron_layer(hidden1, n_hidden2, name="hidden2",
                           activation=tf.nn.relu)
    logits = neuron_layer(hidden2, n_outputs, name="outputs")

with tf.name_scope("loss"):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,
                                                              logits=logits)
    loss = tf.reduce_mean(xentropy, name="loss")

def shuffle_batch(X, y, batch_size):
    rnd_idx = np.random.permutation(len(X))
    n_batches = len(X) // batch_size
    for batch_idx in np.array_split(rnd_idx, n_batches):
        X_batch, y_batch = X[batch_idx], y[batch_idx]
        yield X_batch, y_batch

3.2 执行阶段

with tf.Session() as sess:
    init.run()
    for epoch in range(n_epochs):
        for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size):
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
        acc_batch = accuracy.eval(feed_dict={X: X_batch, y: y_batch})
        acc_val = accuracy.eval(feed_dict={X: X_valid, y: y_valid})
        print(epoch, "Batch accuracy:", acc_batch, "Val accuracy:", acc_val)

    save_path = saver.save(sess, "./my_model_final.ckpt")

3.3 使用神经网络

先从硬盘上加载模型参数,然后加载数据集即可。

4 微调神经网络的超参数

神经网络的灵活性恰好是主要的短板:太多的超参数需要调整。
=> 交叉验证网格搜索
=> Oscar工具

4.1 隐藏层的个数

逐渐增减调试过拟合和欠拟合情况、

4.2 每个隐藏层中的神经元数

逐步添加神经元的数量,知道出现过拟合。

可以使用更多的层次和神经元,然后提早结束训练来避免过度拟合。

dropout。

4.3 激活函数

大多数情况隐藏层可使用ReLU。

输出可用sofmax,回归可不用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38262728/article/details/88551453

智能推荐

boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等-程序员宅基地

一、使用同步定时器这个示例程序通过展示如何在一个定时器执行一个阻塞等待介绍ASIO。

大神总结的Android小经验-程序员宅基地

做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。查看SQLite日志adb shell setprop log.tag.SQLiteLog Vadb shell setprop log.tag.SQLiteStatements V因为实现里用了Log

poj1270按字典序输出所有拓扑排序_IsTime time的博客-程序员宅基地

poj1270题目大意:按字典序输出所有拓扑排序./*dfs适合枚举所有组合,每次做出一个选择,到达边界,就完成了一次完整的枚举,对选择规定某种次序及约束,就可以完成按照需求顺序的枚举;无向图的dfs其实是dfs实现的bfs拓扑排序,每次选一个入度为零的点,进行深入;*/#include <iostream>#include <cstring>#include<string>#include <algorithm>#include<

Tomcat目录权限设置_linux中tomcat做目录访问权限设置,防止目录遍历-程序员宅基地

在web应用中,对页面的访问控制通常通过程序来控制,流程为:登录 -> 设置session -> 访问受限页面时检查session是否存在,如果不存在,禁止访问对于较小型的web应用,可以通过tomcat内置的访问控制机制来实现权限控制。采用这种机制的好处是,程序中无需进行权限控制,完全通过对tomcat的配置即可完成访问控制。为了在tomcat页面设置访问权限控制,在项目的WEB-INF_linux中tomcat做目录访问权限设置,防止目录遍历

吉林大学计算机学硕复试,吉大计算机学硕复试(回忆版)-2015(没全写)-程序员宅基地

1、编写一算法,将X插入到不减有序序列的合适位置,让序列继续有序。(10分)#include#define N 100#define length 9int main(){int *Insert(int *A,int num,int len);int A[N]={3,5,7,9,13,23,27,29,38};int i,num;printf("原数列为:\n");for(i=0;iprintf(..._吉林大学计算机学硕复试

python读取csv数据(添加列名,指定分隔方式)_pd.read_csv按列划分-程序员宅基地

添加列名:pd.read_csv(file, header=None, names = ['a','b','c'] )names为指定的名字数据tab分隔的时候去读方式sep指定df = pd.read_csv('../input/data_train.csv',sep = '\t',encoding='GBK')..._pd.read_csv按列划分

随便推点

《Linux/UNIX系统编程手册》读书笔记-程序员宅基地

2018-1-30一、UNIX、C语言以及Linux的历史回顾1. UNIX简史、C语言的诞生 1969年,贝尔实验室的Ken Thompson首次实现了UNIX系统。 1973年,C语言步入成熟期,人们以其重写了几乎整个UNIX内核。2. UNIX两大分支:BSD、System V 1969~1979年间,UNIX历经了多个版本,其中从第七版起,UNIX...

EntityManager使用方法_em.createquery-程序员宅基地

原文地址:http://blog.sina.com.cn/s/blog_548258eb0100j3lf.html作者:风神Session bean or MD bean对Entity bean的操作(包括所有的query, insert, update, delete操作)都是通过EntityManager实例来完成的。EntityManager是由EJB 容器自动地管理和配置的,不需要_em.createquery

kali安装python2、python3以及对应的pip_kali没有自带python2_金色的天空的博客-程序员宅基地

kali自带python2python --version #查看python版本安装pipwget https://bootstrap.pypa.io/pip/2.7/get-pip.py #下载pippython get-pip.py #安装pippython -m pip -V #查看安装pip的版本_kali没有自带python2

electron 使用electron-packager打linux-x64包与linux-arm64包,解决打包缓慢问题_electron linux-程序员宅基地

在使用electron-packager打包的过程中,需要在第一次下载electron版本对应的zip文件,下载很缓慢,而且还可能出现每次都在下载zip的情况。解决思路是提前下载好zip文件并修改electron—packager源码将zip的路径指定到你放zip的文件目录,去规避packager自己去下载zip文件。实现更快的完成打包_electron linux

Mindspore跑model_zoo里的Bert-Thor,outputs 不合理_:model execute task_小乐快乐的博客-程序员宅基地

您好,问题原因应该是learning_rate的step默认的是30000步,您可以在lr_generator.py中调整learning_rate和damping这两个超参。2.在跑pretrain_eval.py使用的参数DATA_FILE,FINETUNE_CKPT怎么设置?答您可以在bert_thor/src/evaluation_config.py脚本中设置参数DATA_FILE,FINETUNE_CKPT。DATA_FILE,FINETUNE_CKPT怎么设置?..._:model execute task