全连接NN:
每个神经元与前后相邻层的每一个神经元都有全连接关系。输入是特征,输出为预测结果。
参数个数(前层*后层+后层)
实际应用时,会先对原始图像进行特征提取,再把提取到的特征送给全连接网络
会先进行若干层提取,把提取的特征放入全连接网络。
卷积计算可以认为是一个有效提取图像特征的方法。
一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动,遍历输入特征图中的每个像素点。
当前卷积核的个数,决定了输出特征图的深度
卷积利用立体卷积核实现参数空间共享。对应元素相乘+偏置项b。
红绿蓝三层分别和各层卷积相乘+b求和,得到输出特征图的一项。
按指定步长滑动。
使用CNN实现离散数据的分类(以图像分类为例)
感受野:卷积神经网络各层输出特征图中的每个像素点,在原始输入图片上映射区域的大小,
当输入特征图边长大于10个像素点时,3*3性能要比5*5好。
全零填充
当使用全零填充时=输入特征 5/1=5
不全零填充 特征-卷积核+1/步长 向上取整
tf.keras.layers.Conv2D( filters = 卷积核个数,kernel_size= 卷积核尺寸, strides=滑动步长,padding="same"or"valid",activation="relu"...)
批标准化
标准化:使数据符合0的均值,1为标准差的分布,】
批标准化:对一小撮数据做标准化处理
Hi' = HiK - uK/δ
BN操作将原本偏移的特征数据拉回线性区域。使得输入数据的微小变化更明显的体现到激活函数的输出,提升激活函数对数据的区分力,但使激活函数丧失了非线性特征,因此在BN操作中引入缩放因子γ和偏移因子β,保证函数的非线性表达力。
池化操作
池化用于减少特征数据量,最大值池化可提取图片纹理,均值池化可保留背景特征。
tf.keras.layers.MaxPool2D(pool_size=, strides=, padding=)
舍弃
在神经网络训练时,将一部分神经元按照一定概率从神经元中暂时舍弃,神经网络使用时被舍弃的神经元恢复链接
tf.keras.layers.Dropout(舍弃的概率)
卷积神经网络:借助卷积核特征提取后,送入全连接网络
卷积神经网络的八股套路。
卷积就是特征提取器。CDAPB
cifar10数据集
cifar10=tf.keras.datasets.cifar10
load_data()读取训练集。
x_train 是5万个32行32列3通道的RGB像素点
卷积神经网络搭建示例
使用6个5x5的卷积核,过2*2的池化核,池化步长是2
过128个神经元的全连接层,最后要过一个10个神经元的全连接层,因为有10个特征
C(核6*5*5,步长1,填充:same)
B(yes)
A(relu)
P(max, 核2*2 ,步长:2,填充:same)
Flatten
Dense(神经元:128,激活relu, Dropout:0.2)
Dense(深刻警员:10,激活softmax )
class
Baseline(Model):
def __init__(self):
super(Baseline, self).__init__()
C self.c1 = Conv2D(filters+6, kernel_size=(5, 5),padding='same') #6个卷积核,5*5,使用全零填充
B self.b1 = BarchNoermalization() #使用BN操作
A self.a1 = Activation('relu') #激活函数
P self.p1 = MaxPool12D(pool_size=(2,2), strides=2,padding='same') # 池化核是2*2, 池化步长是2
D self.d1 = Dropout(0.2) #百分之20休眠神经元
self.flatten = Flatten() #拉直
self.f1 = Dense(128, activation='relu') #送入128个神经元的全连接
self.d2 = Dropout(0.2)# 按照百分之20休眠神经元
self.f2 = Dense(10, activation='softmax') #送入10个神经元的全连接
使用call调用init函数每个网络结构,从输入到输出,过一次前向传播。返回推理结果
#配置训练方法,选择哪种优化器,选择哪个损失函数,那种评测指标
model.compile
# 告知训练集的输入特征和标签,,每个batch是多少,要迭代,训练集,告知多少次迭代测试集验证准确率,使用回调函数完成断点续训
history = model.fit
import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model
np.set_printoptions(threshold=np.inf)
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
class Baseline(Model):
def __init__(self):
super(Baseline, self).__init__()
self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same') # 卷积层
self.b1 = BatchNormalization() # BN层
self.a1 = Activation('relu') # 激活层
self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same') # 池化层
self.d1 = Dropout(0.2) # dropout层
self.flatten = Flatten()
self.f1 = Dense(128, activation='relu')
self.d2 = Dropout(0.2)
self.f2 = Dense(10, activation='softmax')
def call(self, x):
x = self.c1(x)
x = self.b1(x)
x = self.a1(x)
x = self.p1(x)
x = self.d1(x)
x = self.flatten(x)
x = self.f1(x)
x = self.d2(x)
y = self.f2(x)
return y
model = Baseline()
#配置训练方法,选择哪种优化器,选择哪个损失函数,那种评测指标
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
checkpoint_save_path = "./checkpoint/Baseline.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
print('-------------load the model-----------------')
model.load_weights(checkpoint_save_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
save_weights_only=True,
save_best_only=True)
# 告知训练集的输入特征和标签
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
callbacks=[cp_callback])
model.summary()
# print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
file.write(str(v.name) + '\n')
file.write(str(v.shape) + '\n')
file.write(str(v.numpy()) + '\n')
file.close()
############################################### show ###############################################
# 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
tensorboardx 第三方库
最常用的三个功能
1.记录数据分类指标,进行分类任务,实时监控训练数据。
2.记录图像效果
记录日志
1.import logging
notset 不记录任何信息 < debug 记录开发过程中的细节信息 <info < warning 记录可能存在的问题< error 程序运行时发生的错误 < cartical 严重的错误,例如程序崩溃
在正常情况下,会输出warning级别以上的
通过logging.basicConfig
通过logging打印参数
logging.basicConfig(format="%(ressage)s", level=lpgging.INFO, filmae='./mnist.log',filemode='w')
以覆盖的方式打印
2. 实例化summaryWriter()
#不指定任何参数, 默认路径为"runs/CURRENT_DATETIME_HOSTNAME"
writer = SummaryWriter().
#通过参数log_dir 指定日志路径
wiret = SummaryWriter(log.dir="./runs/verdion")
# 通过参数comment 指定日志路径后缀,与参数log_dir同时使用,不起作用
writer = SummaryWriter(comment="_resent")
使用add_scalar记录数字常量
writer.add_scalar(tag, scalsr_value, global_step, walltime=None)
tag:(string)数据图表名称
scalar_value:(float)需要记录的数据,通常在图表中作为y轴的数据
gloab_step:(int, optional) 训练的step, 通常在图表中作为x轴的数据
walltime:(float, optional)记录生成的时间,默认为time.time()