超简单!手把手教你写神经网络

谈到神经网络,大家的想法可能是这样的:

者这样的:

实最简单的神经网络模型就是一个多元非线性拟合模型, 如下图,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

整理:杨海军

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181102G1VTJT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券