Tensorflow学习日志
Tensorflow学习日志
2020.2.17
1.ImportError: cannot import name '_validate_lengths' 解决方法
numpy升级以后遇到以上错误,版本变化函数名称发生变化:根据错误提示点击到arrycrop.py文件
加入下面语句
修改前:
1 | import numpy as np |
修改后
1 | import numpy as np |
2020.2.16
1.python里__pycache__文件夹的产生与作用
模块的调用
Python中导入模块时,实际上会把被导入的模块执行一遍,如下:
先看被调用的模块test.py:
1 | def haha(): |
再看主程序main.py:
1 | import test |
执行结果是:
1 | 哈哈 |
那怎么才能只是单纯调用而不执行被调用模块的代码呢?要想被调用模块代码不被执行,前提得知道变量__name__是什么意思,简单来说就是,如果不涉及模块导入的话,__name__的值就是” __main__“,如果当此模块被导入引用的话,那么这个模块内的__name__值就是文件的名字(不带.py),如下test_1.py:
1 | def haha(): |
test_1.py执行结果为:
1 | 哈哈 |
如果test_1被导入引用的话,如test_2:
1 | import test_1 |
test_2x运行结果为:
1 | 哈哈 |
上边所说要是弄懂的话,那我们在被调用的模块中,可执行的代码前加上这么一句判断,if __name __ == '__main __':,被调用的模块的代码就不会被执行了!
接下来才是正题
以下参考自Joy_Shen的一个回答。
先大概了解一下python基本运行机制。Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。
解释器的具体工作:
1、完成模块的加载和链接;
2、将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;
3、从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件。
之后若再次执行该脚本,它先检查【本地是否有上述字节码文件】和【该字节码文件的修改时间是否在其源文件之后】,是就直接执行,否则重复上述步骤。
__pycache__文件夹的意义何在呢?
因为第一次执行代码的时候,Python解释器已经把编译的字节码放在__pycache__文件夹中,这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的 *.pyc 文件,大大缩短了项目运行前的准备时间。
2.梯度下降法(minist,softmax)
不使用tf的梯度下降
1 | import tensorflow as tf |
使用tf的随机梯度下降
1 | import tensorflow as tf |
还有一些梯度下降例子在这里
https://blog.csdn.net/wc781708249/article/details/79290523
3.卷积
读取图片,生成图片
1 | import matplotlib.pyplot as plt |
卷积函数
1 | tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None) |
参数:
input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)
filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1
padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑
use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true
卷积实现
1 | import cv2 |
2020.2.12
1.import错误
换tensorflow版本或者cudnn版本。2.0.0可以运行
2.清除session缓存
1 | from keras import backend as K |
3.保存图
1 | sess=tf.compat.v1.Session() |
4.用浏览器启动图时,cmd指令(端口6006)
1 | tensorboard --logdir="保存图的文件夹" |
5.graph
每个程序有默认的graph,可以自己新建graph
新建的graph里添加op用with模块,在with模块外的op操作都视作默认graph里的操作
1 | import tensorflow as tf |
6.session的参数
session有target graph config参数
直接用session读取的是默认的graph
1 | 以下操作等价 |
7.session.run()的参数
fetches:可以是op或者tensor对象,如果是op则输出为noe,如果是tensor则run()的输出为一个numpy数组
feed_dict:从字典中取值
8.占位符的使用
1 | import tensorflow as tf |
9.变量的使用
变量在sess.run前必须先初始化,否则会报错
正确做法如下
1 | e=tf.Variable(3,name="var1") |
多个sess里有多份变量的当前值
想要重置变量为初始值时,执行初始化就行
2020.2.9
1.sess的graph为空
试试清空session命令
常用
1.数学运算
1 | # 算术操作符:+ - * / % |
矩阵数学函数
1 | # 矩阵乘法(tensors of rank >= 2) |
Reduction:reduce various dimensions of a tensor
1 | # 计算输入 tensor 所有元素的和,或者计算指定的轴所有元素的和 |
Scan:perform scans (running totals) across one axis of a tensor
1 | # Compute the cumulative sum of the tensor x along axis |
Segmentation
沿着第一维(x 轴)根据 segment_ids(list)分割好相应的数据后再进行操作
1 | # Computes the sum/mean/max/min/prod along segments of a tensor |
序列比较与索引提取
1 | # 比较两个 list 或者 string 的不同,并返回不同的值和索引 |
2.变量初始化函数
1 | zeros=tf.zeros([2,2]) |