# 建立抽象模型
x = tf.placeholder(tf.float32, [None, 784]) # 输入占位符
y = tf.placeholder(tf.float32, [None, 10]) # 输出占位符(预期输出)
W = tf.Variable(tf.zeros([784, 10])) #784维的10个数字的数组
b = tf.Variable(tf.zeros([10])) #1 维的10个数字的数组
a = tf.nn.softmax(tf.matmul(x, W) + b) # a表示模型的实际输出
# 定义损失函数和训练方法
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 损失函数为交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度下降法,学习速率为0.5
train = optimizer.minimize(cross_entropy) # 训练目标:最小化损失函数
resnet
y=F(x)+x
其设计的目的是解决深度网络的退化问题。在不知道多深的网络比较合适的情况下,按照现有研究,增加深度对于模型学习是有帮助的,所以需要加很深,但是太深就会有退化。解决办法是让多余的层变为恒等映射。直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x。因此,可以说是在学习残差。简单来说,在进行恒等映射的回收,学习残差比学习原来的映射函数要简单。
GoogleNet V4
每个Inception module最后都使用了一个1x1的卷积(linear activation),作用是保证identity部分和Inception部分输出特征维度相同,这样才能保证两部分特征能够相加。
同时多一层1*1可以增加非线性特征。
DenseNet
1.通过跨层连接(across layers),就是所有block前前后后全部连接在一起
2.1*1降维
一个DenseBlock有五层dense,前面在输入时有一个bottleneck层,因为DenseNet每一层都和前面所有层相连,concat会产生很多参数,因此需要通过1*1卷积降维减少输入参数,减少计算量,前四层之间进行BN-RELU-CONV,最后一层是transition layer,也是为了减少输出结果和前面各层concat后产生一个巨量的参数,
1*1卷积主要目的是用来降维(减少channels)
比如输入时候为(256*256*64),channels为64,可选择输出32个channels,(256*256*32)
而池化层的降维是(256*256*64),pool或者conv步幅stride为2,输出的是(128*128*64),降低的是尺寸。
所以卷积降维是减少channel,池化降维是减少尺寸
拉普拉斯矩阵L
L = D − A L=D-A
L=D−A
其中,L为Laplacian矩阵;
D是顶点的度矩阵(对角矩阵),对角线上的元素依次为各个顶点的度(与该顶点相连的边的条数);
A是图的邻接矩阵。
池化层就是采样层。
池化和下采样的关系
下采样和池化应该是包含关系,池化属于下采样,而下采样不局限于池化,如果卷积 stride=2,此时也可以把这种卷积叫做下采样。池化层中进行的操作是下采样。
所以如果卷积层中stride=2,也是在卷积层中的下采样