一、 softmax层
作用:将一个神经网络的输出变成一个概率分布。原始的输出被用作置信度来生成新的输出,这个输出满足概率分布的所有要求。这个概率可以理解为,经过神经网络的推导,一个样例以不同类别的输出概率分别是多大。这个概率分布可以直接通过计算交叉熵来计算预测概率分布和真实答案概率之间的距离。
所以在1中介绍的损失函数的y和y_应该是经过softmax之后的值。代表着概率分布。
二 、损失函数的定义 用来刻画预测值与真实值之间的差异
2.1 对于分类问题 交叉熵
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
其中 tf.reduce_mean 代表求均值
tf.clip_by_value代表给y设定值域范围
y_ 代表真实值 y代表预测值 y和y_应该是经过softmax之后的值。代表着概率分布。
2.2 对于分类问题 tf.nn.softmax_cross_entropy_with_logits( y,y_ )
交叉熵和损失函数进行统一封装。这里的y y_代表着原始的网络输出 并不是经过softmax之后的概率分布
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y, labels= tf.argmax(y_,1))
#计算当前batch中所有cross_entropy的平均值
loss= tf.reduce_mean(cross_entropy)
2.3 对于回归问题 直接求偏差
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))
回归问题就是指只有一个输出节点,输出节点就是预测值,比如房价预测,销量预测。
上面loss求解来预测和真实值之间的平均偏差
求均方误差
loss = tf.reduce_mean(tf.squre(y_ - y))
三、 优化算法 反向传播的优化算法
learning_rate = 0.001
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
常见的优化算法还有
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
四、激活函数
将一个线性网络转变为一个非线性网络,这个非线性函数就是激活函数。
常用的非线性激活函数 tf.nn.relu tf.sigmoid tf.tanh
五、构建卷积层
IMAGE_SIZE = 28
IMAGE_CHANNELS = 1
NUM_LABELS = 10
#第一层卷积尺寸和深度
CONV1_DEEP = 32
CONV1_SIZE = 5
#第二层卷积尺寸和深度
CONV2_DEEP = 64
CONV2_SIZE = 5
#全连接层的节点个数
FC_SIZE = 512
#================================== 第一层 卷积层 窗口大小5*5==============================//
with tf.variable_scope('layer1_cov1'):
cov1_weights = tf.get_variable("weight",[CONV1_SIZE,
CONV1_SIZE,
IMAGE_CHANNELS,
CONV1_DEEP], #过滤器的深度
initializer=tf.truncated_normal_initializer(stddev = 0.1))
cov1_bias = tf.get_variable("bias",[CONV1_DEEP],initializer = tf.constant_initializer(0.0))
cov1 = tf.nn.conv2d(input_tensor, #代表第几张图片
cov1_weights, #权重
strides=[1,1,1,1], #前后两位必须为1 中间代表步长step 长宽每次步进1
padding='SAME') #采用0来填充图片 输出的宽度大小为 IMAGE_SIZE/step = 28
#添加偏置项 + 计算结果正则化
relu1 = tf.nn.relu(tf.nn.bias_add(cov1,cov1_bias))
#第一层由(28,28,1)转换成为(28,28,32)
上面代码定义了一个卷积层 输入为28*28*1的图像 经过卷积层之后 输出为28*28*3 (因为是全0填充 padding='SAME')
其中卷积函数
cov1 = tf.nn.conv2d(input_tensor, #代表第几张图片
cov1_weights, #权重
strides=[1,1,1,1], #前后两位必须为1 中间代表步长step 长宽每次步进1
padding='SAME') #采用0来填充图片 输出的宽度大小为 IMAGE_SIZE/step = 28
加入偏置bias 不能直接采用 + ,而需要使用 tf.nn.bias_add
tf.nn.relu代表正则化结果,激活函数,去线性
六、构建池化层
一般采用最大值或者平均值来计算,有效缩小矩阵的尺寸,减少最后全连接的参数个数,加快计算,且防止过拟合。
#================================== 第二层 池化层 ===============================//
#这一层的输入为上一层的输出 即28*28*32 池化层选取的过滤器边长为2 使用全0填充
#移动的步长也为2 因此 输出为14*14*32
with tf.name_scope("layer2-pool1"):
pool1 = tf.nn.max_pool(
relu1,
ksize=[1,2,2,1], #过滤器的尺寸 首尾必须为1 中间代表过滤器的尺寸 2*2
strides=[1,2,2,1], #步长 后两位必须为1 中间代表步长step 长宽每次步进2
padding='SAME' #采用0来填充图片
)
ksize代表pool池子的长宽。收尾必须为1,中间为池子的长和宽。
strides代表步长,即每一次移动的step。收尾必须为1,中间为池子的移动的长宽step。
===========================================================================
最近新开的公众号,文章正在一篇篇的更新,
公众号名称:玩转电子世界。
各位朋友有什么问题了可以直接在上面提问,我会一一进行解答的。
跟着阳光非宅男,一步步走进电子的世界。
关注之后回复 资料下载 关键词可以获得免费的视频学习资料下载~~~~!!
已共享的学习视频资料,共享资料正在不断更新中。
共享机器学习/tensorflow视频学习资料: