Tensorflow之卷积神经网络池化层max_pool和avg_pool

1. max_pool和avg_pool接口参数

avg_pool(value, ksize, strides, padding, data_format=“NHWC”, name=None)
max_pool(value, ksize, strides, padding, data_format=“NHWC”, name=None)
1)value:当前神经网络层的节点矩阵。
2)ksize:过滤器的尺寸大小。
3)strides:移动的步长。
4)padding:添加补充方式。和卷积层类似,有两种方式,值分别为:‘SAME’和‘VALID’;SAME是Right和Bottom式填充为相邻值。

2. 示例

import os

import tensorflow as tf
import numpy as np

# 忽略不想提示警告错误的信息
# 1是提示,2是警告,3是错误
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
M = np.array([
        [[1],[-1],[0]],
        [[-1],[2],[1]],
        [[0],[2],[-2]]
    ])
M = np.asarray(M, dtype='float32')
M = M.reshape(1, 3, 3, 1)

pool_avg = tf.nn.avg_pool(M, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
pool_max = tf.nn.max_pool(M, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
with tf.Session() as sess:
    # 初始化
    tf.global_variables_initializer().run()
    # 输出池化层的值
    print("最大池化:\n",sess.run(pool_max))
    print("均值池化:\n",sess.run(pool_avg))    

结果:
在这里插入图片描述

3. 数学解析

神经网络节点输入层矩阵
在这里插入图片描述

填充相同值:
在这里插入图片描述

对于步长为[1,2,2,1];需要对四块小矩阵进行均值或者最大值运算,得到池化结果。
四小块矩阵如下:
在这里插入图片描述
对这四块小矩阵的元素,计算均值或者最大值。得到:
1)均值
在这里插入图片描述

2)最大值
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基于TensorFlow框架实现的手写数字图像识别代码,使用的是卷神经网络(CNN)模型。 首先,导入需要的库: ``` import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data ``` 然后,定义一些常量和超参数: ``` learning_rate = 0.001 training_epochs = 15 batch_size = 100 n_classes = 10 dropout = 0.75 # 输入数据的维度 n_input = 784 # 28*28 ``` 接着,定义占位符: ``` x = tf.placeholder(tf.float32, [None, n_input]) y = tf.placeholder(tf.float32, [None, n_classes]) keep_prob = tf.placeholder(tf.float32) ``` 定义卷层和池化层函数: ``` def conv2d(x, W, b, strides=1): x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') x = tf.nn.bias_add(x, b) return tf.nn.relu(x) def maxpool2d(x, k=2): return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME') ``` 接下来,定义卷神经网络模型: ``` def conv_net(x, weights, biases, dropout): x = tf.reshape(x, shape=[-1, 28, 28, 1]) # 第一层卷层 conv1 = conv2d(x, weights['wc1'], biases['bc1']) conv1 = maxpool2d(conv1, k=2) # 第二层卷层 conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) conv2 = maxpool2d(conv2, k=2) # 全连接层 fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) fc1 = tf.nn.relu(fc1) fc1 = tf.nn.dropout(fc1, dropout) # 输出层 out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) return out ``` 然后,初始化权重和偏置: ``` weights = { 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), 'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), 'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), 'out': tf.Variable(tf.random_normal([1024, n_classes])) } biases = { 'bc1': tf.Variable(tf.random_normal([32])), 'bc2': tf.Variable(tf.random_normal([64])), 'bd1': tf.Variable(tf.random_normal([1024])), 'out': tf.Variable(tf.random_normal([n_classes])) } ``` 接着,定义损失函数和优化器: ``` pred = conv_net(x, weights, biases, keep_prob) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) ``` 定义评估模型的准确率函数: ``` correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) ``` 最后,训练模型: ``` mnist = input_data.read_data_sets('/tmp/data/', one_hot=True) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 训练循环 for epoch in range(training_epochs): avg_cost = 0. total_batch = int(mnist.train.num_examples/batch_size) # 遍历所有批次(batch) for i in range(total_batch): batch_x, batch_y = mnist.train.next_batch(batch_size) # 运行优化器 sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout}) # 计算损失值 avg_cost += sess.run(cost, feed_dict={x: batch_x, y: batch_y, keep_prob: 1.}) / total_batch # 显示每一轮训练的结果 if epoch % 1 == 0: print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost)) # 计算测试数据的准确率 print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.})) ``` 这样,一个基于TensorFlow框架实现的手写数字图像识别代码就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值