菜鸡分享一下自己的学习历程
由于网上有很多对神经网络的更为详细和深度的介绍,在我的文章中更重于对结果的探讨而不是原理的理解(其实我自己也不明白咋回事手动滑稽)
这次利用的是tensorflow官方所给出的样例代码,用于解决mnist问题。tensorflow给的代码注释很清晰,很方便新手在此基础上直接对神经网络结构进行修改。
本篇文章解决的将是较为简单的平面点二分类问题,因为这个问题较为简单,并且更为直观。为了方便输入,我这里采用的是生成一个随机数组来做feed_dict,因为用的是np.random.random,也就是随机选取了二维平面[0,1][0,1]上的点,可以保证各区域的点出现均匀,但由于每次运行都不是同一组数据,会导致每次结果都不一样,这是因为每次梯度下降后所到达的极值位置不同,因此不算是标准的样本,但足以用于较为简单的分析中。
在tensorflow所给出的样例中,我们不难总结到神经网络结构主要有以下几个超参数:
1. learning_rate 学习率,决定梯度下降的速度
2. num_step 学习的样本数量
3. batch_size 随机梯度下降中每步中所选取的样本数量(因为用的普通笔记本,太大的计算量承受不起,微笑中透漏着贫穷)
4. 神经网络的深度(层数)
5. 神经网络的广度(每层神经元数量)
6. 激活函数种类,主要有softmax,relu,sigmoid,tanh等,官方样例中给的是softmax
本篇文章主要讨论1.2.等(易于讨论出结果的,手动滑稽)问题。
以下是我的代码,五层结构,每层10个神经元,中间加了loss和acc的可视化,可以帮助理解神经网络结构是如何逐渐减小误差提高准确率的,最后面加了最终分类结果的可视化,同时算是均匀地选取区域内的点作为test去算accuracy。函数classifier是用于定义自己想要的分类区域(当然是可以用函数描述的),我这里选取的边界曲线全都是非线性的,并且还分开了,一个是圆,另一个是四次函数。
from __future__ import print_function
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# Parameters
learning_rate = 0.01
num_steps = 1000
batch_size = 100
display_step = 100
# Network Parameters
n_hidden_1 = 10 # 1st layer number of neurons
n_hidden_2 = 10 # 2nd layer number of neurons
n_hidden_3 = 10 # 3rd layer number of neurons
n_hidden_4 = 10 # 4th layer number of neurons
n_hidden_5 = 10 # 5th layer number of neurons
num_input = 2 # data input (img shape: 2)
num_classes = 2 # total classes (2 digits)
# tf Graph input
X = tf.placeholder("float", [None, num_input])
Y = tf.placeholder("float", [None, num_classes])
# Store layers weight & bias
with tf.name_scope('parameters'):
weights = {
'h1': tf.Variable(tf.random_normal([num_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'h3': tf.Variable(tf.random_normal([n