莫烦Python--Tensorflow(5):简单神经网络

构建简单神经网络

import tensorflow as tf
import numpy as np

# creat data
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3                                   # 要预测的数据需要满足,x_data*0.1, bias 满足0.3

'''
机器学习要做的事情就是,让定义的Weight,biases初始值,通过不断学习,接近0.1,0.3这样所设定的值
'''

### creat tensorflow structure start ###
Weight = tf.Variable(tf.random_uniform([1], -1.0, 1.0))     # 调用随机函数,生成权重,维度是1,范围是(-1.0,1.0)
biases = tf.Variable(tf.zeros([1]))                          # 初始化偏置项为0,维度为1

y = Weight*x_data + biases                                  # 我们要计算的y满足的式子

loss = tf.reduce_mean(tf.square(y-y_data))                  # 构建损失函数,刚开始定义的参数损失会非常大
optimizer = tf.train.GradientDescentOptimizer(0.5)          # 优化器,0.5是学习率
train = optimizer.minimize(loss)                            # 不断优化loss,使得每次训练的损失减小

init = tf.initialize_all_variables()                        # 初始化所有定义的参数
'''
神经网络就是定义一个图,使得图中的网络动起来
'''
### creat tensorflow sturcture end ###

'''sess就像一个指针,指向init中的每一个变量,这样就都被激活了'''
sess = tf.Session()
sess.run(init)                                              # very important,激活我们之前定义的神经网络的参数

# 开始训练
# 每训练20次,输出一次当前的权重和偏执
for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(Weight), sess.run(biases))

'''
运行结果:
0 [0.7010317] [-0.00366911]
20 [0.26770934] [0.2167949]
40 [0.14662763] [0.2768668]
60 [0.11296372] [0.29356837]
80 [0.10360426] [0.29821184]
100 [0.10100207] [0.29950285]
120 [0.10027859] [0.2998618]
140 [0.10007747] [0.29996157]
160 [0.10002153] [0.29998934]
180 [0.10000598] [0.29999703]
200 [0.10000164] [0.2999992]
'''

Session 会话控制

'''session 会话控制'''
import numpy as np
import tensorflow as tf

matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2],
                      [2]])

product = tf.matmul(matrix1,matrix2)        # matmul = matrix multiply 矩阵乘法

# 两种打开模式
# method1
sess = tf.Session()
result = sess.run(product)                  # 只有sess.run(需要执行的变量),才能输出,这是tensorflow的思考模式
print(result)
sess.close()                                # 最好写上,代码更系统一些

# method2
with tf.Session() as sess:
    print(sess.run(product))
'''
运行结果:
[[12]]
'''

Variable 变量

'''Variable 变量'''
import numpy as np
import tensorflow as tf

state = tf.Variable(0, name='counter')
print(state.name)
one = tf.constant(1)                          # 定义常量1

new_value = tf.add(state, one)
update = tf.assign(state, new_value)

init = tf.initialize_all_variables()          # must have if define variables

with tf.Session() as sess:
    sess.run(init)                            # 激活参数
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))
'''
运行结果:
1
2
3

总结:
当你定义tf.Variable()时,一定要用init = tf.initialize_all_variables()进行初始化
当定义with tf.Session() as sess:时,一定要用sess.run(init)激活参数
'''

feeds 传入值(placeholder)

'''feeds 传入值'''

import tensorflow as tf

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)

output = tf.multiply(input1, input2)
with tf.Session() as sess:
    print(sess.run(output, feed_dict={input1: [7.], input2: [2.]}))
'''
运行结果:
[14.]

总结:
当用了placeholder后,就证明和sess.run(),feed_dict绑定了,只有当feed_dict给它赋值时才改变
'''

激活函数

'''
    1.激活函数:就是现实总不会是像我们想像的那么美好,需要激活函数来帮助我们,eg:sigmoid(0,1),relu(大于0时为y=x,小于0为0),tanh(-1,1)
    2.激活函数必须时可微的,将误差反向传递时只有这些可微的激活函数才能把误差传递回去
    3.当你的神经网络只有两三层时,随便一个激活函数都可以掰弯它,但是当网络层数很深时,就需要慎重考虑了,
因为稍不留神就会导致梯度消失,梯度爆炸等情况。梯度爆炸在图像上是“悬崖式"的,它会导致下一次优化的值在悬崖的延长线上:非常远。
    4.在卷积神经网络中推荐使用:relu
    5.在循环神经网络中推荐使用:relu 、tanh
    6.多标签分类用sigmoid,多类分类用softmax。relu最常用。
'''
posted @ 2019-12-15 16:02  旅人_Eric  阅读(103)  评论(0编辑  收藏  举报