# 建立抽象模型 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可以增加非线性特征。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)