单个神经元

  • 单个神经元
  • 激活函数
  • 损失函数
  • 优化器
  • Maxout

单个神经元

一个神经元由以下几个关键知识点组成:

  • 激活函数
  • 损失函数
  • 梯度下降

将所有输入的信号经过w变换后,再添加一个额外的偏执量b,把它们加载一起求和,然后在选择一个模拟细胞体处理的函数来实现整个过程的仿真。这个函数称为激活函数。

把w和b赋予合适的值时,配合合适的激活函数,就会发现可以产生很好的拟合效果,这个过程叫做正向传播

实际过程中无法得知w和b的值具体是多少才是正常的,因此加入训练过程来让模型自动修正,最终产生一个合适的权重,这叫做反向传播

而如何将输出的误差转化为权重的误差,使用BP算法(误差反向传播算法)

激活函数主要作用是用来加入非线性因素的,以解决线性模型表达能力不足的缺陷

神经网络里常用的激活函数有Sigmoid,Tanh和Relu等

Sigmoid函数:把输入的值压缩到0到1之间,TensorFlow中对应函数为tf.nn.sigmoid(x,name=None)

Tanh函数:将值域扩展到-1到1之间,TensorFlow对应函数tf.nn.tanh(x,name=None)

ReLU函数(也称为Rectifier),max(0,x) ,仅在正向传播方面在信号响应上有优势,
TensorFlow中对应函数:

  • tf.nn.relu(features,name=None):一般的ReLU函数,max(features,0)
  • tf.nn.relu6(features,name=None):是以6位阈值的ReLU函数,即min(max(features,0),6)

relu6存在的原因是防止梯度爆炸, 当节点和层数特别多
而且输出都为正时, 它们的加和会是一个很大的值, 尤其在经历几层变
换之后, 最终的值可能会离目标值相差太远。 误差太大, 会导致对参数
调整修正值过大, 这会导致网络抖动得较厉害, 最终很难收敛。

其他变种:

  • tf.nn.softplus(features,name=None)
  • tf.nn.elu(features,name=None)
  • tf.maximum(x,leak*x,name=name) #leak为传入的参数,可以设为0.01等

还可以手动封装Swish函数,要优于ReLU函数

1
2
def Swish(x,beta=1):
return x*tf.nn.sigmoid(x*beta)

softmax算法-处理分类问题

tf.nn.softmax(logits,name=None) 计算softmax

tf.nn.log_softmax(logits,name=None) 对softmax取对数

实际使用中,softmax伴随的分类标签都为one_hot编码,在softmax时,需要将目标分成几类,就在最后这层放几个节点

损失函数

两种比较常见的损失函数:

  • 均值平方差
  • 交叉熵

损失函数的选取取决于输入标签数据的类型

如果输入的是实数、无界的值,损失函数使用平方差

如果输入的标签是位矢量(分类标志),使用交叉熵会更合适

TensorFlow中的梯度下降函数

在TensorFlow中是通过一个叫做Optimizer的优化器类进行训练优化的,对于不同算法的优化器,在TensorFlow中有不同的类

在训练过程中,先实例化一个优化函数如tf.train.GradientDescentOptimizer,并基于一定的学习率进行梯度优化训练

optimizer=tf.train.GradentDescentOptimizer(learning_rate)

接着使用一个minimize()的操作,里面传入损失值节点loss,再启动一个外层的循环,优化器就会按照循环的次数一次次沿着loss最小值的方向优化参数

目前比较常用的优化器为Adam优化器

每个优化器的第一个参数learning_rate代表学习率,设置学习率的方法:退化学习率,又叫学习率衰减

例如:

1
learning_rate=tf.train.exponential_decay(starter_learning_rate,global_step,100000,0.96)

这种方式定义的学习率就是退化学习率,它的意思是当前迭代到global_step步,学习率每一步都按照每10万步缩小到0.96%的速度衰退

通过增大批次处理样本的数量也可以起到退化学习率的效果。但是这种方法要求训练时的最小批次要与实际应用中的最小批次一致

单个神经元的扩展——Maxout网络

将激活函数变成一个网络选择器,原理就是将多个神经元并列地放在一起,从它们的输出结果找到最大的那个,代表对特征响应最敏感,然后取这个神尽管的结果参与后面的运算。这样的网络会有更好的拟合效果

Maxout的拟合功能很强大,但是也有节点过多,参数过多,训练过慢的缺点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/")
import tensorflow as tf #导入tensorflow库

tf.reset_default_graph()
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data维度 28*28=784
y = tf.placeholder(tf.int32, [None]) # 0-9 数字=> 10 classes

# Set model weights
W = tf.Variable(tf.random_normal([784, 10]))
b = tf.Variable(tf.zeros([10]))


z= tf.matmul(x, W) + b


maxout = tf.reduce_max(z,axis= 1,keep_dims=True)
# Set model weights
W2 = tf.Variable(tf.truncated_normal([1, 10], stddev=0.1))
b2 = tf.Variable(tf.zeros([1]))
# 构建模型
pred = tf.nn.softmax(tf.matmul(maxout, W2) + b2)

# 构建模型
#pred = tf.nn.softmax(z) # Softmax分类

# Minimize error using cross entropy
#cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=z))
#参数设置
learning_rate = 0.04
# 使用梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

training_epochs = 200
batch_size = 100
display_step = 1


# 启动session
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())# Initializing OP

# 启动循环开始训练
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples/batch_size)
# 遍历全部数据集
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# Run optimization op (backprop) and cost op (to get loss value)
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
y: batch_ys})
# Compute average loss
avg_cost += c / total_batch
# 显示训练中的详细信息
if (epoch+1) % display_step == 0:
print ("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))

print( " Finished!")


Epoch: 0001 cost= 4.593184041
Epoch: 0002 cost= 1.818854022
Epoch: 0003 cost= 1.314909137
、、、
Epoch: 0197 cost= 0.289531484
Epoch: 0198 cost= 0.289406507
Epoch: 0199 cost= 0.289030269
Epoch: 0200 cost= 0.288644536
 Finished!


单个神经元
https://shanhainanhua.github.io/2019/10/20/单个神经元/
作者
wantong
发布于
2019年10月20日
许可协议