第1关:神经元与激活函数
本文章所有内容均来自头歌实践教学平台,还望同学们好好学习!
任务描述
本关任务:编写一个能模拟神经元工作过程的函数。
相关知识
什么是神经元
我们这里指的神经元是人工神经网络(以下简称神经网络)的神经元,而不是生物意义上的神经网络。
使用得最广泛的神经网络的定义是 T.kohenen 在1988年给出的:
神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。
上面的定义中的简单单元就是我们将要介绍的神经元(neuron)。在生物神经网络中,神经元之间相互连接,当某个神经元的电位超过某个阈值时,它就会处于兴奋状态,向其他神经元发送化学物质。
人工神经网络中的神经元的工作过程也类似于生物神经网络中的神经元。
神经元的工作过程
在1943年,McCulloch和Pittis等人根据生物神经网络中的神经元的工作原理抽象为了如下图所示的神经元模型:
这个模型一直被沿用至今,被叫做 M-P 神经元模型。
在这个模型中,神经元接收来自 n 个其他神经元传递过来的输入信号(即图中的 x1,⋯,x n)。这些信号通过权值进行连接 (即图中的 w 1,⋯,w n),然后将连接后的结果与神经元的阈值进行比较 (即最后输出部分的函数内的参数),之后再用激活函数处理比较的结果,即得到本神经元的输出。
本关的任务就是要模拟这个过程。
激活函数
激活函数可以将输入值映射到0和1之间,最常用的激活函数是Sigmoid函数,如图:
它的函数表达式为 1+e −x1。 在 TensorFlow 中,Sigmoid函数被包装成了tf.sigmoid()函数,这个函数除了name名字参数之外只需要输入一个张量参数即可。使用这个函数时,它会返回张量中每个元素经过Sigmoid函数之后的结果。
除了Sigmoid函数之外还有许多的激活函数,如tanh函数,relu函数等等,我们之后再介绍它们。
如何求张量的各个元素之和
我们可以使用tf.reduce_sum函数求张量的各个元素之和,tf.reduce_sum函数有许多参数,不过我们这里先不介绍他们,大家只需要知道,给tf.reduce_sum函数传入一个张量,它就会返回一个代表着这个张量各个元素之和的0维张量了。
编程要求
根据提示,在右侧编辑器补全neuron(input_value, weight, threshold)函数以模拟神经元的工作过程,使用Sigmoid函数作为激活函数。
input_value是一个一维张量,代表着从各个神经元传入的值。
weight也是一个一维张量,表示本神经元与这些神经元之间的连接权重。
threshold是一个零维张量,代表本神经元的阈值。
需要注意,函数需要返回一个浮点数,而不是一个张量。
参考代码:
第1关:神经元与激活函数
# -*- coding: utf-8 -*-
import tensorflow as tf
# 模拟一个 M-P 神经元的工作原理
# input_value 是输入值, 类型为一维的tf.constant
# weight 是这个神经元的权重, 类型为一维的tf.constant
# threshold 是这个神经元的阈值, 类型为零维的tf.constant
# 返回值是一个浮点数
def neuron(input_value, weight, threshold):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
#输入值乘以权重
res = input_value * weight
#将各个神经元的值进行相加 - 阈值
ans = tf.reduce_sum(res) - threshold
#用sigmoid()函数比较结果
return tf.sigmoid(ans).eval()
# ********** End **********#
第2关:神经元与激活函数 - tanh方法
# -*- coding: utf-8 -*-
import tensorflow as tf
# 模拟一个 M-P 神经元
class neuron(object):
# 构造函数
# weight为本神经元的权重,类型为一维的tf.constant
# threshold 是这个神经元的阈值, 类型为零维的tf.constant
def __init__(self, weight, threshold):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
self.weight = weight
self.threshold = threshold
# ********** End **********#
# 计算函数
# input_value 是输入值, 类型为一维的tf.constant
# 返回值是一个浮点数
def computes(self, input_value):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
res = input_value*self.weight
ans = tf.reduce_sum(res) - self.threshold
return tf.tanh(ans).eval()
# ********** End **********#
第3关:构建简单的单隐层前馈神经网络
# -*- coding: utf-8 -*-
import tensorflow as tf
# 模拟一个 M-P 神经元
class neuron(object):
# 构造函数
# weight为本神经元的权重,类型为一维的tf.constant
# threshold 是这个神经元的阈值, 类型为零维的tf.constant
def __init__(self, weight, threshold):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
self.weight = weight
self.threshold = threshold
# ********** End **********#
# 计算函数
# input_value 是输入值, 类型为一维的tf.constant
# 返回值是一个浮点数
def computes(self, input_value):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
res = input_value*self.weight
ans = tf.reduce_sum(res) - self.threshold
return tf.nn.relu(ans).eval()
# ********** End **********#
# 模拟神经网络中的一层
class Dense(object):
# 构造函数
# weights 为本层中每个神经元的权重,元素类型为一维的tf.constant,weights的类型是python的列表
# thresholds 为本层中每个神经元的权重,元素类型为零维的tf.constant,thresholds的类型是python的列表
def __init__(self, weights, thresholds):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
size=len(weights)
self.neurons=[]
#初始化神经元
for i in range(size):
self.neurons.append(neuron(weights[i],thresholds[i]))
# ********** End **********#
# 计算函数
# input_value 是输入值, 类型为一维的tf.constant
# 返回值应为一个 1 维, 长度为n的Tensor, n是本层中神经元的数量
def computes(self, input_value):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
res=[]
size=len(self.neurons)
#对每个神经元进行计算
for i in range(size):
res.append(self.neurons[i].computes(input_value))
return tf.constant(res)
# ********** End **********#
# 模拟一个简单的神经网络
# input_value是这个神经网络的输入,类型为一维的tf.constant
# wegihtsOfMiddle 是这个神经网络中间层每个神经元的权重, 元素类型为一维的tf.constant,wegihtsOfMiddle的类型是python的列表
# thresholdsOfMiddle 是这个神经网络中间层每个神经元的阈值, 元素类型为零维的tf.constant,thresholdsOfMiddle的类型是python的列表
# wegihtsOfOut 是这个神经网络输出层每个神经元的权重, 元素类型为一维的tf.constant,wegihtsOfOut 的类型是python的列表
# thresholdsOfOut 是这个神经网络输出层每个神经元的阈值, 元素类型为零维的tf.constant,thresholdsOfOut 的类型是python的列表
# 返回值是一个一维浮点数组 (注意不是Tensor),数组的长度为输出层神经元的数量
def NetWork(input_value, wegihtsOfMiddle, thresholdsOfMiddle, weightsOfOut, thresholdsOfOut):
# 请在此添加代码 完成本关任务
# ********** Begin *********#
# 中间层
mid=Dense(wegihtsOfMiddle,thresholdsOfMiddle)
##输出
out=Dense(weightsOfOut,thresholdsOfOut)
return out.computes(mid.computes(input_value)).eval()
# ********** End **********#