前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用tensorflow layers相关API快速构建卷积神经网络

使用tensorflow layers相关API快速构建卷积神经网络

作者头像
OpenCV学堂
发布2018-12-13 14:21:51
9400
发布2018-12-13 14:21:51
举报

Layers API介绍

tf.layers包中包含了CNN卷积神经网络的大多数层类型,当前封装支持的层包括:

  • 卷积层
  • 均值池化层
  • 最大池化层
  • 扁平层
  • 密集层
  • dropout层
  • BN层
  • 转置卷积层

我们将基于卷积层、池化层、扁平层与密集层构建一个简单网络模型,实现手写数字识别mnist数据集的训练。首先需要详解的介绍一下卷积层与池化层API与参数。 tf.layers.conv2d是卷积层组件、定义与参数解释如下:

conv2d(
    inputs,
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format='channels_last',
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer=None,
    bias_initializer=init_ops.zeros_initializer(),
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)

# 参数解释如下:

input表示输入tensor
filters表示输出的深度维度、也是卷积核的个数
kernel_size 卷积核的大小,一个整数或者是一个元组
strides=(1, 1), 卷积时候的步长、一个整数或者一个元组,默认是1x1的步长
padding 填充方式,默认valid意思是不够的丢弃,如果是same表示不够时候补零
dilation_rate 是否使用膨胀卷积,默认不使用
activation激活函数
use_bias 是否使用增益偏置
kernel_initializer卷积核初始化参数方式,如果设置为None默认为xavier_initializer
bias_initializer 增益初始化,默认初始化为零
kernel_regularizer卷积核正则化
bias_regularizer 增益偏置正则化
activity_regularizer对输出进行正则化
kernel_constraint 约束、当核被Optimizer更新后应用到核上。Optimizer用来实现对权重矩阵的范数约束或者值约束。映射函数必须将未被影射的变量作为输入,且一定输出映射后的变量(有相同的大小)。做异步的分布式训练时,使用约束可能是不安全的。
bias_constraint 约束、当偏差向量被Optimizer更新后应用到偏差向量上
trainable 是否可训练,废话,当然是True
name 给这个卷积操作取个名字,方便以后获取它

tf.layers.max_pooling2d是最大池化层组件、定义与参数解释如下:

max_pooling2d(
    inputs,
    pool_size, 
    strides,
    padding='valid', 
    data_format='channels_last',
    name=None
)
input表示输入tensor
pool_size表示输出的深度维度、也是卷积核的个数
strides=(1, 1), 卷积时候的步长、一个整数或者一个元组,默认是1x1的步长
padding 填充方式,默认valid意思是不够的丢弃,如果是same表示不够时候补零
data_format表示数据格式顺序,默认是channels_last数据的格式顺序为(batch, height, width, channels)。如果是 channels_first数据格式顺序为 (batch, channels, height, width)
name最大池化层的名字

代码实现

声明输入的占位符

x = tf.placeholder(shape=[None, 784], dtype=tf.float32)
y = tf.placeholder(shape=[None, 10], dtype=tf.float32)
keep_prob = tf.placeholder(dtype=tf.float32)
x_image = tf.reshape(x, [-1, 28, 28, 1])

构建网络 基于layers相关层API只需10行代码的卷积网络,包括两个卷积层+两个池化层+两个全链接层+一个输出层。

def conv_net(x_dict, n_classes, dropout):
    conv1 = tf.layers.conv2d(x_dict, 32, 5, activation=tf.nn.relu)
    pool1 = tf.layers.max_pooling2d(conv1, pool_size=2, strides=2)

    conv2 = tf.layers.conv2d(pool1, 64, 3, activation=tf.nn.relu)
    pool2 = tf.layers.max_pooling2d(conv2, pool_size=2, strides=2)

    fc1 = tf.layers.flatten(pool2, name="fc1")
    fc2 = tf.layers.dense(fc1, 1024)
    fc2 = tf.layers.dropout(fc2, rate=dropout)
    out = tf.layers.dense(fc2, n_classes)
    return out

训练网络

logits = conv_net(x_image, num_classes, keep_prob)
cross_loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y)
loss = tf.reduce_mean(cross_loss)
step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

# accuracy
acc_mat = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
acc = tf.reduce_sum(tf.cast(acc_mat, tf.float32))
prediction = tf.argmax(logits, axis=1)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        is_training = True
        batch_xs, batch_ys = mnist.train.next_batch(min_batch)
        _, curr_loss = sess.run([step, loss], feed_dict={x: batch_xs, y: batch_ys, keep_prob: 0.5})
        if (i + 1) % 1000 == 0:
            is_training = False
            conv_y, curr_acc = sess.run([logits, acc], feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0})
            print("current loss: %f, current test Accuracy : %f" % (curr_loss, curr_acc))

最终在测试集上得到的准确率高达99%以上, 有图为证:

不要因路远而踌躇,

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Layers API介绍
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档