深度学习_1_Tensorflow_1
# 深度学习 # 图像识别,自然语言处理 # 机器学习 深度学习 # 分类:神经网络(简单) 神经网络(深度) # 回归 图像:卷积神经网络 # 自然语言处理:循环神经网络 # cpu:运行操作系统,处理业务,计算能力不是特别突出 # gpu:专门为计算设计的 import tensorflow as tf a = tf.constant(5.0) b = tf.constant(6.0) sum1 = tf.add(a,b) # 在session外边打印时只能查看对象 # 程序的图 a,b,sum1也有graph graph = tf.get_default_graph() print(a.graph) print(graph) # session()运行默认的图,当运行的元素不是默认图的时候,会报错 with tf.Session() as sess: print(sess.run(sum1)) # 输出值 # 创建新的图 g = tf.Graph() with g.as_default(): c = tf.constant(11.0) print(c.graph) # 与上边的图不同 # 图程序的空间,变量,线程等资源都在图中 # 会话运行图的程序, # tf.Session(graph=c) 指定图运行, 里边run的时候要注意 # session.run的作用:启动整个图 # session.close:关闭,释放资源河 # Session中的参数 # tf.Session(config=tf.ConfigProto(log_device_placement=True)) # 交互式session:tf.InteractiveSession() # 调用后,不用Session() 不同run 直接a.eval()也可 # 其实只要有会话的上下文环境,就可以使用eval() # =================================================== # 会话的run() # run(fetches,feed_dict=None,graph=None) 运行ops与tensor # fetches 需要run的内容 有多个时使用[] # 不是op不能run 例:sum2 = 1+3 # 但 sum3=1+tf.constant(3.0) 可以run(sum3) # ======================================== # 实时提供数据 # placeholder # tf.placeholder(dtype,shape=None,name=None) # plt = tf.placeholder(tf.float32,[2,3]) [None,3]也可 # run(plt,feed_dict={plt:[[1,2,3],[4,5,6]]}) input1 = tf.placeholder(tf.float32) # 可以说是一个占位符,使用的时候需要传入值 input2 = tf.placeholder(tf.float32) output = input1*input2 with tf.Session() as sess: # 传值的时候使用feed_dict 字典 占位符对象作为键,值需要使用[] 包含 print(sess.run(output,feed_dict={input1:[7],input2:[2.6]})) # ============================================================= # 张量tensor # 将numpy中的数组封装为tensor类型 # tensor:名字,shape,dtype # 阶:维度 # 数据类型:tf.float32,64(其实没有意义,实际还是32) int8-64,uint8,string,bool # print(a.shape,a.name,a.op,a.graph) # 0维:() 1维:(n) 2维:(n,m) ... # ====================================== # Numpy:reshape 把原来的数据直接修改 # tensorflow中 # tf.reshape:创建新的张量 动态形状 # tf.Tensor.set_shape:更新Tensor的静态形状 # 静态形状 (当数量不确定时可以,切不能跨维度) plt = tf.placeholder(tf.float32,[None,2]) # shape=(?,2) plt.set_shape([3,2]) # shape=(3,2) plt.set_shape([4,2]) # 此时不能修改 # 动态形状 (注意元素个数不能改变,可跨维度) new_plt=tf.reshape(plt,[2,3]) # shape=(2,3) # ========================================== # 有默认值的张量 # tf.zero(shape,dtype=tf.float32,name=None) 全为0 # tf.ones(shape,dtype=float32,name=None) 全为1 # tf.constant(value,dtype=None,shape=None,name=None) 常量张量 # tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=float32,seed=None,name=None) 由正太分部的随机值组成的矩阵 # ========================== # 张量的类型变换 # tf.string_to_number(string_tensor,out_type=None,name=None) 等 # tf.cost(x,dtype,name=None) 万能转换 # tf.cost(原来数据,新类型) # =========================== # 数据拼接 a=[[1,2,3],[4,5,6]] b = [[7,8,9],[10,11,12]] # tf.concat([a,b],axis=1) 合并后变为6列 # api https://www.tensorflow.org/versions/r1.0/api_guides/python/math_ops # =================================================== # 变量op 可以持久化, 普通的张量op不行 # 变量op需要在会话中运行初始化 # name参数:在tensorboard中显示名字,可以让相同op名字的数据进行区分 # 设置后 Tensor("Variable") ---->Tensor("设置的name") a = tf.constant([1,2,3,4,5]) random = tf.random_normal([2,3],mean=0.0,stddev=1.0) var = tf.Variable(initial_value=random,name=None,trainable=None) print(a,var) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) # 初始化op print(sess.run([a,var])) # 再次打印 # ==================================================== # 可视化 # 模块:summary with tf.Session() as sess: sess.run(init) filewriter = tf.summary.FileWriter(".",graph=sess.graph) # 运行后生成文件,每次运行都会生成文件, # tensorboard --logdir="生成的文件所在的目录" 会启动一个服务器,访问即可 # =============================================== # 线性回归原理及实现 # 1,转备好特征和目标值 # 2,建立模型 模型参数必须是变量 # 3,求损失函数,误差 均方误差 # 4,梯度下降优化损失过程,指定学习率 # ========运算api # tf.matmul(x,w) 矩阵运算 # tf.squqre(error) 平方 每个样本误差平方 # tf.reduce_mean(error) 每个列表平均值 # ===========梯度下降api # tf.train.GradientDescentOptimizer(learning_rate) # minimize # 返回梯度下降op # ============================================== # tensorflow 实现简单的线性回归 import tensorflow as tf def myregression(): """ 自实现一个线性回归预测 """ # 1,准备数据, x 特征值[100,10] y目标值[100] # 准备x x = tf.random_normal([100,1],mean=1.75,stddev=0.5,name="x_data") # 准备y,自定义出实际的w,b # 矩阵相乘必须是二维的 y_true= tf.matmul(x,[[0.7]])+0.8 # 2,建立模型 # 随机的权重与偏置,让进行优化 # 只能使用变量定义,trainable控制该变量 训练的时候是否要变化 weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=0.75),trainable=True) bias = tf.Variable(0.0,name="b") y_predcit = tf.matmul(x,weight)+bias # 3,建立损失函数,均方误差 loss = tf.reduce_mean(tf.square(y_true-y_predcit)) # 4,梯度下降优化损失 youhua = tf.train.GradientDescentOptimizer(0.1) # 一般0-1之间不能太大, # 也可2,3,10等 若太大可能会出现nan:梯度爆炸 # 解决方案:重新设计网络,调整学习率,使用梯度截断,使用激活函数 train_op = youhua.minimize(loss) # 收集tensor tf.summary.scalar("losses",loss) # 在tensorborad中 scalars 会显示在学习的过程中loss的变化曲线 tf.summary.histogram("weights",weight) # 定义合并tensor的op merged=tf.summary.merge_all() saver = tf.train.Saver() init = tf.global_variables_initializer() # 会话运行 with tf.Session() as sess: sess.run(init) # 打印不优化的train_op print(sess.run([weight,bias])) filewrite = tf.summary.FileWriter(".",graph=sess.graph) # 模型恢复 # 模型文件存在 # saver.restore("sess","路径") # 循环运行优化 for i in range(1000): sess.run(train_op) # 运行合并的tensor summary = sess.run(merged) filewrite.add_summary(summary,i) print("第{}次".format(i),sess.run([weight, bias])) saver.save(sess,"./reserve/model") if __name__ =="__main__": myregression() # ======================== # tensorflow变量作用域tf.variable_scope()创建指定名字的变量作用域 # 不同的部分放在不同的作用域下,tensorflowboard中graph 会更加清晰,作用分明 with tf.variable_scope("name"): pass # 增加变量显示 # 添加权重参数,损失值等在tensorborad中显示 # 1,收集变量 # tf.summary.scalar(name="",tensir)收集对于损失函数和准确率等单值变量,name为变量值,tensor为值 # tf.summary.histogram(name="",tensor) 收集高维度的变量参数 # 2,合并变量写入事件文件 # merged = tf.summary.merge_all() # 运行合并:summary=sess.run(merged) 每次迭代都需要运行 # 添加:FileWriter.add_summary(summary,i)i表示第几次迭代 # ======================== # tensorflow变量作用域tf.variable_scope()创建指定名字的变量作用域 # 不同的部分放在不同的作用域下,graph 会更加清晰,作用分明 with tf.variable_scope("name"): pass # 模型的保存与加载 saver = tf.train.Saver(var_list=None,max_to_keep=5) # var_list:指定要保存和还原的变量,作为一个dict或列表传递 # max_to_keep:指示要保留的最近检查点文件的最大数量,创建新文件时,删除旧文件,保留最新的5个 # 文件格式:checkpoint文件 saver.save("sess对象","路径/文件名字") # 第一次保存 # checkpoint:记录模型名字,文件路径 # name.data-00000-of-00001 数据存储文件 # name.index name.meta # 模型的加载 # saver.restore(sess,"路径") # 在with放入会话中,开始优化前 # =================================== # 自定义命令行参数 # 1, 首先定义有哪些参数需要在运行时指定 # 2,程序当中获取定义的命令行参数 # 名字,默认值,说明 # 以前的版本 # tf.app.flags.DEFINE_integer("max_step",100,"模型训练的步数") # tf.app.flags.FLAGS.max_step 获取数据 # 新版 flags = tf.flags.FLAGS # 定义对象 tf.flags.DEFINE_integer("max_step",100,"模型训练的步数") tf.flags.DEFINE_string("file_path","","文件路径") tf.flags._FlagValuesWrapper # 初始化 flags.max_step=100 # 修改 或获取 # 定义完成后 运行文件时 python xx.py --max-step=500 即可传入,字符串需要加引号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可评论咨询.