当谈到神经网络,大家的想法可能是这样的:
或者这样的:
其实最简单的神经网络模型就是一个多元非线性拟合模型, 如下图,a就是变量,w是权重(系数),g是激活函数(非线性函数),z就是输出值。和众多拟合方法一样,这个模型的终极目标就是确定w,使得输出z值与真实z值越接近越好。由此我们可以定义出这个模型的loss function=(z-z')^2,为了达到目标函数的最小值,常用的方法就是梯度下降法。
下面是一个拟合平面的实例,看看如何用17行代码完成一个神经网络的程序。这是一段使用Python撰写的TensorFlow 示例,首先生成了一些三维数据,然后用一个平面拟合它。
--------------------------------------
# TensorFlow是谷歌开发和维护的计算库,使用TensorFlow可以高度简化机器学习过程中复杂的计算问题。初次使用 #Tensorflow,建议利用Anaconda来安装,它还很方便的自带Python IDE。
# numpy 是Python科学计算非常常用的库
import tensorflow as tf
import numpy as np
# 数据生成
y_data = np.dot([0.100, 0.200], x_data) + 0.300 # 根据形如 w1*x1+w2*x2+b=y的方程,构建平面方程,生##成真实y数据。
# 在TensorFlow中,Tensor代表着N维数据,而它的计算依赖计算图,下面构建计算图。
b = tf.Variable(tf.zeros([1])) # Variable变量可以起到占位和更新参数的作用,在执行前必须初始化。
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
# 所有计算过程都建立操作结点到计算图中,计算图里描述的计算并没有真正执行,只是进行了定义和描述,要实际执行我们就需要在会话(session)里被启动.
# 定义模型参数
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss) #训练过程即是利用优化器(这里是梯度下降优化)最小化loss function。
# 初始化变量,定义 init 结点
init = tf.initialize_all_variables()
# 定义Session对象
sess = tf.Session()
# sess.run执行操作
sess.run(init)
# 训练并打印结果
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
# 得到最佳拟合结果 W: [[0.100 0.200]], b: [0.300]
----------------------------------------------------------
如果你认为定义计算图以及启动会话还是太麻烦了,那么你可以用Keras, MatLab或者PyTorch。以Keras 为例,同样的问题我们可以写出下面的程序:
----------------------------------------------------------
# Import Keras package
# Keras是一个高层神经网络API, 由Python编写并可基于TensorFlow、Theano 以及CNTK后端,它还有一些常用的训练数据库和预训练模型可以利用,是随手一跑模型的便利之选。
from keras.models import Sequential
from keras.layers import Dense
from keras import optimizers
import numpy as np
# 数据生成
x_data = np.float32(np.random.rand(2, 100))
y_data = np.dot([0.100, 0.200], x_data) + 0.300
# 建立模型
model = Sequential()
model.add(Dense(1, activation=None, input_shape=(2,)))
# 编译和训练
model.compile(optimizer=optimizers.SGD(lr=0.5), loss='mean_squared_error')
model.fit(np.transpose(x_data), y_data, epochs=200, batch_size=20)
model.summary()
print(model.get_weights()) # 得到和上面一样的结果~
# Keras风格更加简洁,高度模块化,能够减少一般应用下用户的工作量,很适合初学者。
--------------------------------------------------------
机器学习说难也难,说简单也简单。十几行的程序买不了吃亏,买不了上当,如果想要试试看这些方法,不如就从现在开始吧!
Reference:
https://keras.io/zh
http://www.tensorfly.cn/tfdoc/get_started/introduction.html
整理:杨海军
领取专属 10元无门槛券
私享最新 技术干货