tensorflow代码的分析
如果没有安装tensorflow 库的要先安装此库.
通过以下命令:pip install tensorflow
即可安装。
源代码如下:
import tensorflow as tf
import numpy as np
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(input_dim=1,nuits=1))
model.compile(loss='mse',optimizer='sgd')
model.summary()
X=np.linspace(-5,5,200)
Y=2*X+np.random.normal(0,0.1,(200,))
model.fit(X,Y,verbose=1,epochs=200,validation_split=0.2)
filename='line_model.h5'
model.save(filename)
print('successfully save line_model.h5')
x=tf.constant([0.5])
model=tf.keras.model.load_model(filename)
y=model.predict(x)
print(y)
这是一个完整的通过Google的神经网络Tensorflow实现的一个代码。
下面对上面这段代码进行解析:
import tensorflow as tf
引入这个tensorflow库 并重命名为 tf 对代码中的引用方便
import numpy as np
引入这个numpy库 并重命名为 np 对代码中的引用方便
model=tf.keras.Sequential()
定义一个初始化模型
kears
== 一个tensorflow
的高级接口
Sequential
代表建立一个神经网络
model.add(tf.keras.layers.Dense(input_dim=1,nuits=1))
添加一层
tf.keras.layers.Dense(input_dim=1,nuits=1)
这是add()
函数的实参传入
input_dim=1,nuits=1
input_dim是输入维度 ,为1代表是 y=f(x)的形式的模型端对端,如果input_dim=2,z=f(x,y),以此类推。
model.compile(loss='mse',optimizer='sgd')
对神经网络模型进行编译
mse
是均方差,就是loss函数
对以上代码运行可以得到一个完整的的五脏俱全的麻雀型神经网络代码。
我们可以 使用 : model.summary()
打印出model 的各层的结构。
如下图:
sequential_5 这是系统自定取得名字(区别于其他模型的)的编号。
每一行是一层神经网络,这个神经网络只有一层隐藏层,
X=np.linspace(-5,5,200)
是生成-5到5中间插值200个数字的 X序列
Y=2*X+np.random.normal(0,0.1,(200,))
Y 是批量对X进行运算
np.random.normal(0,0.1(200,)
代表随机生成 0到0.1 之间的200个随机数
对X里的每一个元素进行运算,批量存入到 Y 的数组
*model.fit(X,Y,verbose=1,epochs=200,validation_split=0.2)
这里的X Y 都是我们自己定义的数据集 为了测试神经网络的拟合能力
fit()函数 是 用输入数据集X 和输出数据集Y
训练神经网络model*
fit中的verbose:
verbose:日志显示
verbose=0为不在标准输出流输出日志信息
verbose=1为输出进条记录
verbose=2为每个epoch输出一行记录
注意:默认为1
小结:
这里实现一个只有一个神经元的神经网络只要三行代码,生成一个数据集,输入输出(人为)2行代码
model.summary()
是打印 神经网络的结构
对神经网络喂数据进去,训练神经网络模型,只有一行代码 fit
最核心的设计神经网络3行+训练神经网络2行 。
这些是封装过的api,实际实现比较复杂,底层实现比实际应用要复杂,但是底层实现过更能够理解深层次的原理,模型通过model.fit
训练好后,model里面就装了一个训练好的weight和b的model 。
filename='line_model.h5'
保存模型到本地命名为filename
model.save(filename)
用model.save()保存为.h5文件
在.py文件同文件夹下就能看到一个.h5文件,这个就是训练好的模型。
end to end (端对端)的学习和使用:
我们可以通过几行代码就可以把网上GitHub上,十几兆,几百兆甚至上GB的h5神经网络拿来为自己所用,不管是deepfake还是人脸识别、植物识别、电力设备识别,钟表识别、刻度识别,只要是任何别人训练好的h5模型,只要下载下来,就可以直接使用。
以后要实现100层,也不一定要100行,可以把有多少层,每一层有多少个神经元,写入一个list用for创建:
for i in range(100):
model.add(.....
加载已经有的模型:
model=tf.keras.models.load_model(filename)
#filename是包含路径的文件名
如果不含路径 默认在.py 的同一个文件夹下。
x=tf.constant([0.5])
这个代表用一个x变量0.5扔进模型里,这一行不含“仍”的动作,只是先定义了一个等待测试的数据x
由于tensorflow的核心网络结构是通过定义图实现,x=tf.constant([0.5])
就是代表定义初始化一个图里的常量的结点【0.5】。
x=tf.constant([0.5])
model=tf.keras.models.load_model(filename)
y=model.predict(x)
print(y)
x=tf.constant([0.5])
定义即将要输入的测试数据
model=tf.keras.models.load_model(filename)
模型的加载
y=model.predict(x)用x作为输入数据
,预测y
print(y)
输出y
可以看到loss不断的降低,说明整体样本误差越来越小。val_loss是validation loss的意思。
对应的是fit当时设置的validation_split=0.2,就是输入训练集的本来有200个,拿了其中20%作为validation的数据集,用来验证训练的是否好坏。
loss是训练误差,val_loss是训练的每个阶段后把validation的数据集拿去喂给模型的误差,也是loss。
我们在曾加一层 网络
model.add(tf.keras.layers.Dense(input_dim=2,nuits=1))
这个
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(input_dim=1,nuits=2))
model.add(tf.keras.layers.Dense(input_dim=2,nuits=1))
model.compile(loss='mse',optimizer='sgd')
第一个隐藏层 :1个输入,2个输出
第二个隐藏层 :2个输入,1个输出
除去输入层和输出层,有两个隐藏层,我们通过model.summary()
打印出神经网络的结构
有两个隐藏层:
第一个:dense_11
第二个:dense_10
Dense的意思是 全连接层(相邻上下层神经元都有连接)。
附加资料:
权重:
神经网络中的权重 ,实际上代表了投票权 ,就是每个神经元对其他神经元的“投票”权重
直到所有投票权重 的某些组合 最能接近真实数据集 说明这种投票组合是接近最好的
神经网络分正向传播 反向传播
正向传播就是 “投票的过程”
反向传播就是 “纠正投票和现实情况的误差,调整投票权重”
并附加 http://playground.tensorflow.org/ 这是一个神经网络游乐场 的google平台
图如下: