优达学城深度学习之六——TensorFlow卷积神经网络

举报
小小谢先生 发表于 2022/04/16 01:23:33 2022/04/16
【摘要】 TensorFlow卷积层 TensorFlow 提供了 tf.nn.conv2d() 和 tf.nn.bias_add() 函数来创建你自己的卷积层。 # Output depthk_output = 64 # Image Propertiesimage_width = 10image_he...

TensorFlow卷积层

TensorFlow 提供了 tf.nn.conv2d() 和 tf.nn.bias_add() 函数来创建你自己的卷积层。


  
  1. # Output depth
  2. k_output = 64
  3. # Image Properties
  4. image_width = 10
  5. image_height = 10
  6. color_channels = 3
  7. # Convolution filter
  8. filter_size_width = 5
  9. filter_size_height = 5
  10. # Input/Image
  11. input = tf.placeholder(
  12. tf.float32,
  13. shape=[None, image_height, image_width, color_channels])
  14. # Weight and bias
  15. weight = tf.Variable(tf.truncated_normal(
  16. [filter_size_height, filter_size_width, color_channels, k_output]))
  17. bias = tf.Variable(tf.zeros(k_output))
  18. # Apply Convolution
  19. conv_layer = tf.nn.conv2d(input, weight, strides=[1, 2, 2, 1], padding='SAME')
  20. # Add bias
  21. conv_layer = tf.nn.bias_add(conv_layer, bias)
  22. # Apply activation function
  23. conv_layer = tf.nn.relu(conv_layer)

TensorFlow最大池化提供函数:tf.nn.max_pool()


  
  1. conv_layer = tf.nn.conv2d(input, weight, strides=[1, 2, 2, 1], padding='SAME')
  2. conv_layer = tf.nn.bias_add(conv_layer, bias)
  3. conv_layer = tf.nn.relu(conv_layer)
  4. # Apply Max Pooling
  5. conv_layer = tf.nn.max_pool(
  6. conv_layer,
  7. ksize=[1, 2, 2, 1],
  8. strides=[1, 2, 2, 1],
  9. padding='SAME')

tf.nn.max_pool() 函数实现最大池化时, ksize参数是滤波器大小,strides参数是步长。2x2 的滤波器配合 2x2 的步长是常用设定。

ksize 和 strides 参数也被构建为四个元素的列表,每个元素对应 input tensor 的一个维度 ([batch, height, width, channels]),对 ksize 和 strides 来说,batch 和 channel 通常都设置成 1

注意:池化层的输出深度与输入的深度相同。另外池化操作是分别应用到每一个深度切片层。

池化对应的代码:


  
  1. input = tf.placeholder(tf.float32, (None, 4, 4, 5))
  2. filter_shape = [1, 2, 2, 1]
  3. strides = [1, 2, 2, 1]
  4. padding = 'VALID'
  5. pool = tf.nn.max_pool(input, filter_shape, strides, padding)

pool 的输出维度是 [1, 2, 2, 5],即使把 padding 改成 'SAME' 也是一样。

TensorFlow中的卷积神经网络

你从之前的课程中见过这节课的代码。这里我们导入 MNIST 数据集,用一个方便的函数完成对数据集的 batch,scale 和 One-Hot编码。


  
  1. from tensorflow.examples.tutorials.mnist import input_data
  2. mnist = input_data.read_data_sets(".", one_hot=True, reshape=False)
  3. import tensorflow as tf
  4. # Parameters
  5. # 参数
  6. learning_rate = 0.00001
  7. epochs = 10
  8. batch_size = 128
  9. # Number of samples to calculate validation and accuracy
  10. # Decrease this if you're running out of memory to calculate accuracy
  11. # 用来验证和计算准确率的样本数
  12. # 如果内存不够,可以调小这个数字
  13. test_valid_size = 256
  14. # Network Parameters
  15. # 神经网络参数
  16. n_classes = 10 # MNIST total classes (0-9 digits)
  17. dropout = 0.75 # Dropout, probability to keep units
  18. Weights and Biases
  19. # Store layers weight & bias
  20. weights = {
  21. 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
  22. 'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
  23. 'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])),
  24. 'out': tf.Variable(tf.random_normal([1024, n_classes]))}
  25. biases = {
  26. 'bc1': tf.Variable(tf.random_normal([32])),
  27. 'bc2': tf.Variable(tf.random_normal([64])),
  28. 'bd1': tf.Variable(tf.random_normal([1024])),
  29. 'out': tf.Variable(tf.random_normal([n_classes]))}
  30. def conv2d(x,w,b,strides=1):
  31. x=tf.nn.conv2d(tf.Variable(x,w,strides=[1, strides, strides, 1], padding='SAME')
  32. x=tf.nn.add_add(x,b)
  33. return tf.nn.relu(x)

在 TensorFlow 中,strides 是一个4个元素的序列;第一个位置表示 stride 的 batch 参数,最后一个位置表示 stride 的特征(feature)参数。最好的移除 batch 和特征(feature)的方法是你直接在数据集中把他们忽略,而不是使用 stride。要使用所有的 batch 和特征(feature),你可以把第一个和最后一个元素设成1。

中间两个元素指纵向(height)和横向(width)的 stride,之前也提到过 stride 通常是正方形,height = width。当别人说 stride 是 3 的时候,他们意思是 tf.nn.conv2d(x, W, strides=[1, 3, 3, 1])

为了更简洁,这里的代码用了tf.nn.bias_add() 来添加偏置。 tf.add() 这里不能使用,因为 tensors 的维度不同。

模型建立


  
  1. def conv_net(x, weights, biases, dropout):
  2. # Layer 1 - 28*28*1 to 14*14*32
  3. conv1 = conv2d(x, weights['wc1'], biases['bc1'])
  4. conv1 = maxpool2d(conv1, k=2)
  5. # Layer 2 - 14*14*32 to 7*7*64
  6. conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
  7. conv2 = maxpool2d(conv2, k=2)
  8. # Fully connected layer - 7*7*64 to 1024
  9. fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
  10. fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
  11. fc1 = tf.nn.relu(fc1)
  12. fc1 = tf.nn.dropout(fc1, dropout)
  13. # Output Layer - class prediction - 1024 to 10
  14. out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])
  15. return out

session运行


  
  1. # tf Graph input
  2. x = tf.placeholder(tf.float32, [None, 28, 28, 1])
  3. y = tf.placeholder(tf.float32, [None, n_classes])
  4. keep_prob = tf.placeholder(tf.float32)
  5. # Model
  6. logits = conv_net(x, weights, biases, keep_prob)
  7. # Define loss and optimizer
  8. cost = tf.reduce_mean(\
  9. tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))
  10. optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)\
  11. .minimize(cost)
  12. # Accuracy
  13. correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
  14. accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
  15. # Initializing the variables
  16. init = tf. global_variables_initializer()
  17. # Launch the graph
  18. with tf.Session() as sess:
  19. sess.run(init)
  20. for epoch in range(epochs):
  21. for batch in range(mnist.train.num_examples//batch_size):
  22. batch_x, batch_y = mnist.train.next_batch(batch_size)
  23. sess.run(optimizer, feed_dict={
  24. x: batch_x,
  25. y: batch_y,
  26. keep_prob: dropout})
  27. # Calculate batch loss and accuracy
  28. loss = sess.run(cost, feed_dict={
  29. x: batch_x,
  30. y: batch_y,
  31. keep_prob: 1.})
  32. valid_acc = sess.run(accuracy, feed_dict={
  33. x: mnist.validation.images[:test_valid_size],
  34. y: mnist.validation.labels[:test_valid_size],
  35. keep_prob: 1.})
  36. print('Epoch {:>2}, Batch {:>3} -'
  37. 'Loss: {:>10.4f} Validation Accuracy: {:.6f}'.format(
  38. epoch + 1,
  39. batch + 1,
  40. loss,
  41. valid_acc))
  42. # Calculate Test Accuracy
  43. test_acc = sess.run(accuracy, feed_dict={
  44. x: mnist.test.images[:test_valid_size],
  45. y: mnist.test.labels[:test_valid_size],
  46. keep_prob: 1.})
  47. print('Testing Accuracy: {}'.format(test_acc))

使用tensor做卷积

让我们用所学知识在 TensorFlow 里构建真的 CNNs。在下面的练习中,你需要设定卷积核滤波器(filters)的维度,weight,bias。这在很大程度上来说是 TensorFlow CNNs 最难的部分。一旦你知道如何设置这些属性的大小,应用 CNNs 会很方便。

这些也是需要你回顾的:

  1. TensorFlow 变量。
  2. Truncated 正态分布 - 在 TensorFlow 中你需要在一个正态分布的区间中初始化你的权值。
  3. 根据输入大小、滤波器大小,来决定输出维度(如下所示)。你用这个来决定滤波器应该是什么样:


  
  1. new_height = (input_height - filter_height + 2 * P)/S + 1
  2. new_width = (input_width - filter_width + 2 * P)/S + 1

  
  1. """
  2. Setup the strides, padding and filter weight/bias such that
  3. the output shape is (1, 2, 2, 3).
  4. """
  5. import tensorflow as tf
  6. import numpy as np
  7. # `tf.nn.conv2d` requires the input be 4D (batch_size, height, width, depth)
  8. # (1, 4, 4, 1)
  9. x = np.array([
  10. [0, 1, 0.5, 10],
  11. [2, 2.5, 1, -8],
  12. [4, 0, 5, 6],
  13. [15, 1, 2, 3]], dtype=np.float32).reshape((1, 4, 4, 1))
  14. X = tf.constant(x)
  15. def conv2d(input):
  16. # Filter (weights and bias)
  17. # The shape of the filter weight is (height, width, input_depth, output_depth)
  18. # The shape of the filter bias is (output_depth,)
  19. # TODO: Define the filter weights `F_W` and filter bias `F_b`.
  20. # NOTE: Remember to wrap them in `tf.Variable`, they are trainable parameters after all.
  21. F_W = tf.Variable(tf.truncated_normal((2,2,1,3)))
  22. F_b = tf.Variable(tf.zeros(3))
  23. # TODO: Set the stride for each dimension (batch_size, height, width, depth)
  24. strides = [1, 2, 2, 1]
  25. # TODO: set the padding, either 'VALID' or 'SAME'.
  26. padding = 'VALID'
  27. # https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#conv2d
  28. # `tf.nn.conv2d` does not include the bias computation so we have to add it ourselves after.
  29. return tf.nn.conv2d(input, F_W, strides, padding) + F_b
  30. out = conv2d(X)

在TensorFlow使用池化层


  
  1. """
  2. Set the values to `strides` and `ksize` such that
  3. the output shape after pooling is (1, 2, 2, 1).
  4. """
  5. import tensorflow as tf
  6. import numpy as np
  7. # `tf.nn.max_pool` requires the input be 4D (batch_size, height, width, depth)
  8. # (1, 4, 4, 1)
  9. x = np.array([
  10. [0, 1, 0.5, 10],
  11. [2, 2.5, 1, -8],
  12. [4, 0, 5, 6],
  13. [15, 1, 2, 3]], dtype=np.float32).reshape((1, 4, 4, 1))
  14. X = tf.constant(x)
  15. def maxpool(input):
  16. # TODO: Set the ksize (filter size) for each dimension (batch_size, height, width, depth)
  17. ksize = [1, 2, 2, 1]
  18. # TODO: Set the stride for each dimension (batch_size, height, width, depth)
  19. strides = [1, 2, 2, 1]
  20. # TODO: set the padding, either 'VALID' or 'SAME'.
  21. padding = 'SAME'
  22. # https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#max_pool
  23. return tf.nn.max_pool(input, ksize, strides, padding)
  24. out = maxpool(X)

自编码器

自编码器是一种执行数据压缩的网络架构。其中压缩和解压功能是从数据本身学习来,而非人工设计的。一般思路如下:

编码器一般用在图像降噪、JPG等文件中。

 

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/89929940

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。