山东大学Python(16)——TensorFlow

#%%
# 使用 jupyter notebook 编写 
"""
本章知识目录:
    1.TensorFlow的特点
    2.基本概念
    3.计算图——Graph
    4.会话——Session
    5.张量——Tensor
    6.变量——Variable
    7.占位符——Placeholders
    8.卷积神经网络
"""
# TensorFlow版本为1.13.2,如果是2.0及以上版本,部分程序可能运行不了
"""
考试:
概念:什么是计算图Graph、会话Session、张量Tensor(最重点,属性,秩,每个维度的张量叫什么名字,如0维纯量,1维向量,2二维矩阵)
给一张图,张量,为节点赋值
变量的创建和使用
占位符的使用
如何运用到神经网络,卷积的参数(一定要搞清楚)
特别是卷积层(重点)
池化层
PPT中的例子
(概念、填空、选择、写程序)都有可能
"""
import tensorflow as tf

#%%

"""
TensorFlow的特点:

    1、真正的可移植性
    引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,
    如安卓设备、ios、树莓派等等
    
    2、多语言支持
    Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和
    执行你的graphs,你可以直接写python/c++程序。
    
    3、高度的灵活性与效率
    TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库
    能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高
    
    4、支持TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望 
    TensorFlow 成为机器学习研究人员和开发人员的通用语言

基本概念:
    TensorFlow核心程序由2个独立部分组成:
        a:Building the computational graph构建计算图
        b:Running the computational graph运行计算图
    计算图是一系列的TensorFlow操作排列成一个有向无环图。
"""

#%%

"""
计算图——Graph:
    计算图是由一系列的tensorflow的操作组成,并且这些操作编配成计算图的节点。 站在计算图的角度,你可以认为tensorflow程序是有相对独立的两部分组成。构建计算图、运行计算图。
"""
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0) 
print(node1, node2)

#%%

"""
会话——Session:
    1.TensorFlow 的 运行模型 为 session(会话),通过会话来执行计算图TensorFlow 使用会话的方式主要有如下两种模式:
    a).sess = tf.Session()     sess.run(...)      sess.close() 
    b).使用上下文管理器
    with tf.Session() as sess: 
        sess.run(...)

    2.会话的run方法
    run(fetches, feed_dict=None,graph=None)
	运行ops和计算tensor
    嵌套列表,元组,
    namedtuple,dict或OrderedDict(重载的运算符也能运行)
    
    feed_dict 允许调用者覆盖图中指定张量的值,提供给
    placeholder使用
    
    返回值异常
        RuntimeError:如果它Session处于无效状态(例如已关闭)。
        TypeError:如果fetches或feed_dict键是不合适的类型。
        ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在。
"""

#%%

"""
张量——Tensor:
    1.张量的秩和数据类型
    2.张量操作
"""

#%%

"""
tensor:张量是tensorflow核心的基本数据单元。 张量是一个多维数组。  
rank:张量的秩,就是张量的维数。 
shape:描述张量的形状。
计算方法:去掉中括号,逗号+1就是数组的值。数组的的长度是rank。
 [1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
 [[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
 [[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
"""

#%%

"""
张量的阶:
    阶     数学实例         Python       
    0       纯量           只有大小
    1       向量          大小和方向
    2       矩阵            数据表
    3       3阶张量        数据立体
    n       n阶张量          …………
"""

#%%

"""
张量属性:
    graph 		张量所属的默认图
    op		    张量的操作名
    name		张量的字符串描述
    shape		张量形状
"""
print(tf.__version__)
node1 = tf.constant(3.0)
node2 = tf.constant(4.0)
sum = node1 + node2
with tf.Session() as sess:
    print(sum.eval())
    print("===")
    print(sum.graph)
    print("===")
    print(sum.op)
    print("===")
    print(sum.name)
    print(sess.run(sum))

#%%

"""
变量——Variable:
    1.当训练模型时,用变量来 存储和更新参数。建模时它们需要被明确地初始化,当创建一个变量时,需要将一个张量作为初始值传入构造函数Variable()。
    2.初始化方式:
        with tf.Session() as sess:
            sess.run(weights.initializer)
        
        init = tf.initialize_all_variables()
        with tf.Session() as sess:
            sess.run(init)
    3.变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量。是在模型训练中,允许修改的量。相同的输入,通过修改变量得到不同输出值。
    4.变量的创建:
    tf.Variable(initial_value=None,name=None)
    创建一个带值initial_value的新变量
    assign(value)
        为变量分配一个新值,返回新值
    eval(session=None)
        计算并返回此变量的值
    name
        属性表示变量名字
    
"""
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(linear_model, {x: [1, 2, 3, 4]}))

#%%

"""
占位符——Placeholders:
    placeholders:在计算图中,能够接受额外输入,通常情况下,提供的值晚于定义。
    意义:在程序执行的时候,不确定输入的是什么,提前“占个坑”
"""
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  
print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
sess.close()

#%%

"""
一个计算图可以参数化的接收外部的输入,作为一个placeholder(占位符),在计算时需要提供一个字典feed_dict来指定placeholder的取值。

"""
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:3.0, input2:2.0}))

#%%

"""
卷积神经网络:
    1.卷积神经网络(Convolutional Neural Network,  CNN)由三部分构成。第一部分是输入层。第二部分由n个卷积层和池化层的组合组成。第三部分由一个全连结的多层感知机分类器构成。这一结构使得卷积神经网络天然适合处理二维特征数据。
    2.卷积层
    对图像和滤波矩阵做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。卷积的主要目的是为了从输入图像中提取特征。卷积可以通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。
filter_weight = tf.Variable(tf.truncated_normal(shape, stddev=0.1))
conv = tf.nn.conv2d(x, filter_weight, strides = [1, 2, 2, 1], padding = ‘SAME’)	
第1个参数对应一个输入batch; 第2个参数提供卷积层的权重;第3个参数为不同维度上的步长,其中第一维和最后一维一定为1,因为卷积层的步长只对矩阵的长和宽有效;最后一个是填充方式。
    3.池化层
    池化,简言之,即取区域平均或最大
    池化有两种: 
        一种是最大池化,在选中区域中找最大的值作为抽样后的值; 
        一种是平均值池化,把选中的区域中的平均值作为抽样后的值。
pool = tf.nn.avg_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
参数和卷积函数类似 最大池化:tf.nn.max_pool
    4.dropout
    在模型训练时按照一定的概率 暂时让网络某些隐含层节点的权重不工作(也称丢弃),作用是防止过拟合。
    TensorFlow中,可以用一个placeholder来代表 dropout 的概率。这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。
    如:
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    keep_prob = tf.placeholder("float")  
    h_fc1_drop = tf.nn.dropout(h_fc1,  keep_prob)
"""
发布了36 篇原创文章 · 获赞 20 · 访问量 2836

猜你喜欢

转载自blog.csdn.net/weixin_43360801/article/details/103325760