每个神经元与前后相邻层的每一个神经元都有全连接关系。输入是特征,输出为预测结果。
参数个数(前层*后层+后层)

实际应用时,会先对原始图像进行特征提取,再把提取到的特征送给全连接网络
会先进行若干层提取,把提取的特征放入全连接网络。
卷积计算可以认为是一个有效提取图像特征的方法。
一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动,遍历输入特征图中的每个像素点。
当前卷积核的个数,决定了输出特征图的深度

卷积利用立体卷积核实现参数空间共享。对应元素相乘+偏置项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 记录开发过程中的细节信息 在正常情况下,会输出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") 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()
使用add_scalar记录数字常量