原创 lightcity 光城 2019-01-16

TensorFlow学习_c++

TensorFlow学习0.导语1.Session会话控制(两种打开模式)2.Tensorflow使用Variable3.Placeholder 传入值4.激励函数(activate function)5.定义添加神经层的函数6.建造神经网络7.matplotlib 可视化8.学习文章

TensorFlow学习

0.导语

本周将会陆续更新莫凡python配套视频的自己学习笔记,学习内容为tensorflow!
欢迎转发,收藏!

预备知识
安装TensorFlow:TensorFlow-Gpu 1.8安装

1.Session会话控制(两种打开模式)

定义矩阵

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

两矩阵相乘

product=tf.matmul(matrix1,matrix2) # matrix mul

Session会话控制方法一

sess=tf.Session()
result=sess.run(product)
print(result) # [[12]]
sess.close()

Session会话控制方法二

# 好处就是不需要写sess.close,因为以下代码在with语句中运行,运行完毕,自动关闭了
with tf.Session() as sess:
    result2=sess.run(product)
    print(result2) # [[12]]

2.Tensorflow使用Variable

写在前面

在 Tensorflow 中,定义了某字符串是变量,它才是变量

定义变量与常量

state=tf.Variable(0,name='counter')
print(state.name) # counter:0
one=tf.constant(1)

变量与常量做加法运算

new_value=tf.add(state,one)

更新state值

update=tf.assign(state,new_value)

变量初始化!!!

# 如果定义变量一定要用这个!
# init=tf.initialize_all_variables() 即将被废除
init=tf.global_variables_initializer()
# 注意:到这里变量还是没有被激活,需要在下面 sess 里, sess.run(init) , 激活 init

激活变量

with tf.Session() as sess:
    sess.run(init)
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))

注意:直接 print(state) 不起作用!!一定要把 sess 的指针指向 state 再进行 print 才能得到想要的结果!

3.Placeholder 传入值

写在前面

'''
Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(),
然后以这种形式传输数据stat.run(***,feed_dict(key:value,key1:value.....))
'''

定义两个placeholder

# 在Tensorflow中需要定义placeholder的type,一般为type32形式
input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)

mul=multiply是将input1和input2做乘法运算

output=tf.multiply(input1,input2)

外部传如data,并输出结果

with tf.Session() as sess:
    print(sess.run(output,feed_dict={input1:[2],input2:[3.0]}))

4.激励函数(activate function)

激励函数运行时激活神经网络中某一部分神经元。

将激活信息向后传入下一层的神经系统。

激励函数的实质是非线性方程。

5.定义添加神经层的函数

写在前面

定义添加神经层的函数def add_layer(),它有四个参数:
输入值、输入的大小、输出的大小和激励函数,
我们设定默认的激励函数是None

定义weights和biases

# 因为在生成初始参数时,随机变量(normal distribution)会比全部为0要好很多,所以我们这里的weights为一个in_size行, out_size列的随机变量矩阵
Weights=tf.Variable(tf.random_uniform([in_size,out_size]))
# biases的推荐值不为0,所以我们这里是在0向量的基础上又加了0.1
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)

激励函数处理

# 当activation_function——激励函数为None时,输出就是当前的预测值——Wx_plus_b,不为None时,就把Wx_plus_b传到activation_function()函数中得到输出
if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)

返回输出

return outputs

完整函数

import tensorflow as tf
# 定义添加神经层的函数
def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_uniform([in_size,out_size]))
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)
    return outputs

6.建造神经网络

导入包numpy

import numpy as np

定义添加神经层的函数

import tensorflow as tf
def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_uniform([in_size,out_size]))
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)
    return outputs

将一个有300个元素的一维数组转换成1列300行的矩阵形式(列向量)

x_data=np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis]

噪点,没有按照函数走,这样看起来会更像真实情况,其中0.05表示方差

noise=np.random.normal(0,0.05,x_data.shape).astype(np.float64)
y_data=np.square(x_data)-0.5+noise

接下来,开始定义神经层。 通常神经层都包括输入层、隐藏层和输出层。这里的输入层只有一个属性, 所以我们就只有一个输入;隐藏层我们可以自己假设,这里我们假设隐藏层有10个神经元; 输出层和输入层的结构是一样的,所以我们的输出层也是只有一层。 所以,我们构建的是——输入层1个、隐藏层10个、输出层1个的神经网络。

# 定义隐藏层
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)
# 定义输出层
predition=add_layer(l1,10,1,activation_function=None)

# 计算预测值predition与真实值的误差,对两者差的平方求和再取平均
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-predition),
                   reduction_indices=[1]))
# 机器学习提升准确率
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 0.1表示学习效率

# 初始化
init=tf.global_variables_initializer()
# 激活变量
sess=tf.Session()
sess.run(init)

训练

for i in range(1000):
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    # 每50步我们输出一下机器学习的误差
    if i % 50 == 0:
        # to see the step improvement
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))

运行


TensorFlow学习_c++_02



7.matplotlib 可视化
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 定义添加神经层的函数
def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_uniform([in_size,out_size]))
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)
    return outputs
# 将一个有300个元素的一维数组转换成1列300行的矩阵形式(列向量)
x_data=np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis]
# 噪点,没有按照函数走,这样看起来会更像真实情况,其中0.05表示方差
noise=np.random.normal(0,0.05,x_data.shape).astype(np.float64)
y_data=np.square(x_data)-0.5+noise
# 输入层1,隐藏层10,输出层1
# 这里的None代表无论输入有多少都可以,因为输入只有一个特征,所以这里是1
xs = tf.placeholder(tf.float32, [None1])
ys = tf.placeholder(tf.float32, [None1])
# 定义隐藏层
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)
# 定义输出层
prediction=add_layer(l1,10,1,activation_function=None)
# 计算预测值prediction与真实值的误差,对两者差的平方求和再取平均
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
                   reduction_indices=[1]))
# 机器学习提升准确率
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 0.1表示学习效率
# 初始化
init=tf.global_variables_initializer()
# 激活变量
sess=tf.Session()
sess.run(init)

绘制散点图

# plot the real data
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data, y_data)
plt.ion() # 连续显示
plt.show()

显示预测数据

# 每隔50次训练刷新一次图形,用红色、宽度为5的线来显示我们的预测数据和输入之间的关系,并暂停0.1s。
for i in range(1000):
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        # to visualize the result and improvement
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
        # plot the prediction r-表示红色实线,lw表示线宽
        lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
        plt.pause(0.1)

问题:红色实线条不显示,解决办法:取消matplotlib默认输出到sciview

取消Settings>Tools>Python Scientific>Show plots in toolwindow勾选项8.学习文章


TensorFlow学习_c++_03

8.学习文章

8.1.Tensorflow简介

https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/

8.2.新版pycharm中,取消matplotlib默认输出到sciview

https://blog.csdn.net/chengyu_whu/article/details/80493477