前言
Tensorflow学习笔记,一个简单的例子,建立一个3层的神经网络(输入层1个神经元 隐藏层10个神经元 输出层1个神经元),通过训练去接近并拟合real_data
,目标为误差loss
的下降,并用pyplot
将过程可视化出来。
学习目的:熟悉神经网络建造逻辑,熟悉Tensorflow功能性函数的应用。
最终输出:
代码
1 | import tensorflow as tf |
1.创建并定义新的神经层
一个新的神经层的逻辑关系如下图
代码:
1 | import tensorflow as tf |
-
1
2
3
4get_local_variable(
*args,
**kwargs
) -
1
2
3
4
5
6
7
8random_normal(
shape,
mean=0.0,
stddev=1.0,
dtype=tf.float32,
seed=None,
name=None
) -
1
2
3
4
5
6
7
8
9
10
11matmul(
a,
b,
transpose_a=False,
transpose_b=False,
adjoint_a=False,
adjoint_b=False,
a_is_sparse=False,
b_is_sparse=False,
name=None
)
2.制作真实数据
代码:
1 | # 生成等差数列,x_data有300行(或者说300个实例),范围-1到1,np.newaxis加一个维度 |
-
1
2
3
4
5
6
7
8numpy.linspace(
start,
stop,
num=50,
endpoint=True,
retstep=False,
dtype=None
) -
1
numpy.random.normal(loc=0.0, scale=1.0, size=None)
3.设置占位xs&ys
代码:
1 | xs = tf.placeholder(tf.float32,[None,1]) |
-
1
2
3
4
5
6tf.placeholder 函数
placeholder(
dtype,
shape=None,
name=None
)tf.placeholder()与feed_dict={} 是前后绑定的,先占位,后传参
tf.float32 是tensorflow中通常采用的默认格式
4.设置层参数
先声明:输入层1个神经元 隐藏层10个神经元 输出层1个神经元
代码:
1 | # 定义隐藏层 |
激励函数 activation_function
查看所有activation_function:官方文档
tf.nn.relu
小于0时等于0大于时线性增加1
2
3
4relu(
features,
name=None
)-
1
2
3
4relu6(
features,
name=None
) -
1
2
3
4crelu(
features,
name=None
) -
1
2
3
4elu(
features,
name=None
) -
1
2
3
4selu(
features,
name=None
) -
1
2
3
4softplus(
features,
name=None
) -
1
2
3
4softsign(
features,
name=None
) -
1
2
3
4
5
6
7dropout(
x,
keep_prob,
noise_shape=None,
seed=None,
name=None
) -
1
2
3
4
5
6bias_add(
value,
bias,
data_format=None,
name=None
) -
1
2
3
4sigmoid(
x,
name=None
) -
1
2
3
4tanh(
x,
name=None
)
TensorFlow提供了多种激励函数的选择,根据不同情况推荐使用不同的激励函数:
- 2-3层神经网络:随意使用,不会有太大影响。
- 在卷积神经网络中:首选 relu
- 在循环神经网络中:首选 relu or tanh
5.误差
代码:
1 | # 误差,predition与ys的差值 |
-
1
2
3
4
5
6
7reduce_sum (
input_tensor ,
axis = None ,
keep_dims = False ,
name = None ,
reduction_indices = None
) -
1
2
3
4
5
6
7reduce_mean(
input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None
)
6.训练设置
代码:
1 | # 训练,减少误差, tf.train.GradientDescentOptimizer为常用方法,学习效率0.1(要求小于1),对象为loss |
tf.train训练函数
tf.train
提供了一组帮助训练模型的类和函数。
optimizer优化器
查看所有 optimizer优化器:官方文档
下图是不同optimizer优化器达到相同训练目标的效率对比:
tf.train.GradientDescentOptimizer
*取决于data的size和类型,将数据拆分,一部分一部分地训练(SGD),优势是能更快找到正确的路径,但达到同样的目的需要更多时间去train。
-
在学习率上动手脚,使训练过程中发生波动的阻力很大(少走弯路),限制其平滑地向目标下降。
-
不仅考虑本步的学习效率,还会加载上一步学习效率的趋势(误差下降更快),所以在速度上会更快,但在方向性上要低于GradientDescent。
tf.train.RMSPropOptimizer
(被AlphaGo采用)*结合Momentum的“下坡走”和Adagrad的”少走弯路“,来提高效率。
-
解决RMSProp中为简化计算缺少Momentum的部分函数的问题。在大部分情况下Adam都能又快又好地解决问题。
7.初始化&指针
代码:
1 | # 初始化 |
tf.global_variables_initializer返回初始化全局变量
有变量就必须定义初始化!!!
8.循环训练
代码:
1 | for i in range(1000): |
feed_dict={xs:x_data,ys:y_data}
在每次sess.run()时以feed_dict的形式传入参数(dict)
9.可视化
代码:
1 | import matplotlib.pyplot as plt |
输出: