承接上讲,文件参照TN_Tutorial.AD_Circuits.FCNN.py :张量网络编程学习笔记(3-0):神经网络模块化编程预备知识_Sauvignon.的博客-CSDN博客
* MNIST 手写字分类介绍:
* 建立 class fcnn(nn.Module)实例:
batch_size:分批次学习(1)控制复杂度(2)间接提升泛化能力(3)针对特定样本提取特征
dim_hidden:超参数,隐藏层的维数 ~ 784 x hidden ~ hidden x 10
def __init__:super(fcnn,self)里面定义一个继承的父类
self.layer1,self.layer2等:定义类属性,在同一个class下可以跨函数插入/调用
MNIST数据集:输入规格28 x 28 = 784手写字灰度图,包含784个标量(0-1之间255个float变量)
x.reshape(x.shape[0],-1) ~ 矩阵化 , 每个样本占一行:
当然,我们可以测试一下:
import torch as tc
from torch import nn
layer = nn.Linear(20,10)
data = tc.randn((2,20),dtype = tc.float32)
out1 = layer(data)
out2 = data.mm(layer.weight.t())+layer.bias
print(layer.weight.shape)
print(layer.bias.shape)
print((out1-out2).norm)
* 建立数据集读取,优化器:
* Softmax-交叉熵损失函数:
* it_times循环里分批次训练,测试:
y : 向前传播的结果样本个数 x 分类数 的 矩阵 = 300 x 10 ; lb(并非独热):300维的向量,
predicted = y.argmax(dim=1)
total += lb.shape[0]
# 逐batch统计分类标签数多少个
num_c += predicted.eq(lb).sum().item()
# 逐batch累计分类标签和预测标签的吻合数目
我们尝试在命令行里直观地打印出来:epoch :20, num_batch[-1]
y.argmax:找到最大元素所在位置,dim = 1对列指标切片返回最大列,最大概率作为分类结果, 最后返回 (分类 )列向量: 样本数 x 1 。
统计一下正确个数:273/300
先将test_loss, num_c, total = 0 ,tc.no_grad( ) ~ 模型梯度 置零:测试集并不参与优化。
在最简单的FCNN分类器num_layer=2 看到:loss 和 acc 随epoch训练曲线如图示:
loss: acc:
如果我们再加一层呢?FCNN分类器num_layer=3 看到:loss 和 acc 随epoch训练曲线如图示:
loss: acc:
:加深!
* 在哪以及如何,需要调用这个模块:
* 仅仅作为教学资料展示的完整FCNN,交待了调nn建立class,模块化编程的基本结构。
* 后文NN_alog.py 的 FC2_classifier,一个打包好的分类器,还有ADQC_classifier
这些都会应用在iris数据集。
* 再QRNN(量子RNN),ADQC,LSTM,LSTM三者对比还会有个LSTM的封装,
RNN,LSTM,这些或许还会作为我们的课程的笔记补充吧()