1 常用函数
(1)tf.Variable()
标记训练网络中的参数,如W,将变量标记为”可训练“,神经网络训练中,常用该函数标记待训练参数
w=tf.Variable(tf.random.normal([2,2],mean=0,stddev=1))
#标记w为待训练参数,初始化生成两行两列的正态分布的随机数,均值为0,标准差为1
(2)tf.matmul ,矩阵乘
(3)tf.data.Dataset.from_tensor_slices,切分传入张量的第一维度,生成输入特征与标签对,构建数据集
data=tf.data.Dataset.from_tensor_slices((输入特征,标签)) #numpy和Tensor格式均可用
(4)tf.GradientTape(),求梯度
with tf.GradientTape() as tape: #with结构记录计算过程,gradient求张量梯度
若干个计算过程
grad=tape.gradient(函数,求导对象)
eg:with tf.GradientTape( ) as tape:
w = tf.Variable(tf.constant(3.0))
loss = tf.pow(w,2)
grad = tape.gradient(loss,w) #对w求偏导
(5)enumerate(列表),枚举函数,常在for循环中使用
for i, element in enumerate(seq)
(6)tf.one_hot,独热码,在分类问题中,常用独热码做标签,标记类别:1表示是,0表示非
(7)tf.nn.softmax,分类函数,使输出符合概率分布
(8)assign_sub,赋值操作,更新参数的值并返回,如更新w
w = tf.Variable(4)
w.assign_sub(1) #w自减1
(9)tf.argmax(张量名,axis=操作轴),返回张量沿指定维度最大值的索引
(10)tf.where(条件语句,真返回A,假返回B)
(11)np.random.RandomState.rand(维度),返回一个[0,1)之间的随机数
(12)np.vstack(数组1,数组2),将两个数组按垂直方向叠加
2 基础知识
(1)指数衰减学习率
(2)正则化:在损失函数中引入模型复杂度指标,利用给W加权值,弱化训练数据的噪声
正则化可以缓解过拟合
3 使用八股搭建神经网络
用Tensorflow API:tf.keras搭建网络八股
(1)import相关模块
(2)train,test:喂入训练集,测试集特征及标签
(3)model=tf.keras.models.Sequential:搭建网络结构(顺序网络结构)
model=tf.keras.models.Sequential([网络结构])#描述各层网络
网络结构:
tf.keras.layers.Flatten() #展平层
tf.keras.layers.Dense(神经元个数, activation= “激活函数“ ,kernel_regularizer=哪种正则化) #全连接层
tf.keras.layers.Conv2D(filters = 卷积核个数, kernel_size = 卷积核尺寸,strides = 卷积步长, padding = " valid” or “same”) #卷积层
tf.keras.layers.LSTM()#循环神经网络
(4)model.compile:配置训练方法,如优化器,损失函数,优化指标
model.compile(optimizer = 优化器,loss = 损失函数,metrics = [“准确率”] )
metrics:网络评测指标
‘accuracy’ :y_和y都是数值,如y_=[1] y=[1]
‘categorical_accuracy’ :y_和y都是独热码(概率分布),如y_=[0,1,0] y=[0.256,0.695,0.048]
‘sparse_categorical_accuracy’ :y_是数值,y是独热码(概率分布),如y_=[1] y=[0.256,0.695,0.048]
(5)model.fit:执行训练过程,训练集特征及标签,batch,epoch
model.fit (训练集的输入特征, 训练集的标签, batch_size= , epochs= , validation_data=(测试集的输入特征,测试集的标签),validation_split=从训练集划分多少比例给测试集,validation_freq = 多少次epoch测试一次)#_data和_split二选一
(6)model.summary:打印网络参数结构和参数统计
搭建跳层网络结构 class替换Sequential
class MyModel(Model): #Model,继承Tensorflow里的Model类
def init(self):
super(MyModel, self).init()
定义网络结构块
def call(self, x):
调用网络结构块,实现前向传播
return y
model = MyModel()
4 八股功能扩展
(1)自制数据集
import tensorflow as tf
from PIL import Image
import numpy as np
import os
#制作数据集
train_path = './mnist_image_label/mnist_train_jpg_60000/'
train_txt = './mnist_image_label/mnist_train_jpg_60000.txt'
x_train_savepath = './mnist_image_label/mnist_x_train.npy'
y_train_savepath = './mnist_image_label/mnist_y_train.npy'
test_path = './mnist_image_label/mnist_test_jpg_10000/'
test_txt = './mnist_image_label/mnist_test_jpg_10000.txt'
x_test_savepath = './mnist_image_label/mnist_x_test.npy'
y_test_savepath = './mnist_image_label/mnist_y_test.npy'
def generateds(图片路径/path,标签文件/txt):
f = open(txt,'r') #打开标签文件,只读
contents = f.readlines() #读取整个文件所有行,保存在contents列表中,每行作为一个元素
f.close()
x,y_ = [],[]
for content in contents:#逐行取出
value = content.split() #以空格分割,图片路径为value[0],标签路径为value[1],存入列表
img_path = path+value[0]
img = Image.open(img_path)#读入图片
img = np.