tensorflow 2.0 深度学习 (第三部分 卷积神经网络 part1)

拼搏现实的明天。 2023-07-02 05:21 86阅读 0赞

" class="reference-link">20191009191333910.png

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


tensorflow 2.0 深度学习(第一部分 part1)

tensorflow 2.0 深度学习(第一部分 part2)

tensorflow 2.0 深度学习(第一部分 part3)

tensorflow 2.0 深度学习(第二部分 part1)

tensorflow 2.0 深度学习(第二部分 part2)

tensorflow 2.0 深度学习(第二部分 part3)

tensorflow 2.0 深度学习 (第三部分 卷积神经网络 part1)

tensorflow 2.0 深度学习 (第三部分 卷积神经网络 part2)

tensorflow 2.0 深度学习(第四部分 循环神经网络)

tensorflow 2.0 深度学习(第五部分 GAN生成神经网络 part1)

tensorflow 2.0 深度学习(第五部分 GAN生成神经网络 part2)

tensorflow 2.0 深度学习(第六部分 强化学习)


watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70

  1. Model: "sequential"
  2. _________________________________________________________________
  3. Layer (type) Output Shape Param #
  4. =================================================================
  5. dense (Dense) multiple 200960
  6. _________________________________________________________________
  7. dense_1 (Dense) multiple 65792
  8. _________________________________________________________________
  9. dense_2 (Dense) multiple 65792
  10. _________________________________________________________________
  11. dense_3 (Dense) multiple 2570
  12. =================================================================
  13. Total params: 335,114
  14. Trainable params: 335,114
  15. Non-trainable params: 0
  16. _________________________________________________________________

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 1

  1. import tensorflow as tf
  2. from tensorflow import keras
  3. # 获取所有 GPU 设备列表
  4. gpus = tf.config.experimental.list_physical_devices('GPU')
  5. #gpus 打印为 [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
  6. if gpus:
  7. try:
  8. # 设置 GPU 显存占用为按需分配
  9. for gpu in gpus:
  10. tf.config.experimental.set_memory_growth(gpu, True)
  11. logical_gpus = tf.config.experimental.list_logical_devices('GPU')
  12. #1 Physical GPUs, 1 Logical GPUs
  13. print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  14. except RuntimeError as e:
  15. # 异常处理
  16. print(e)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 2


" class="reference-link">局部相关性watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 3


权值共享

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 4


卷积运算原理

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 5

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 6


表示学习

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 7

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 9

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 11


" class="reference-link">梯度传播watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 12

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 13

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 14

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 15

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 16


卷积神经网络 基础组成部分

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 17


单通道输入 单卷积核

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 18


多通道输入 单卷积核

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 19


" class="reference-link">多通道输入 多卷积核watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 20


步长

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 21


" class="reference-link">填充watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 22

#


自定义权值/偏置:tf.nn.conv2d卷积运算函数

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 23


" class="reference-link">卷积层类 layers.Conv2D watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 24

  1. import os
  2. os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
  3. import tensorflow as tf
  4. from tensorflow import keras
  5. from tensorflow.keras import layers, optimizers, datasets, Sequential
  6. # 模拟输入,3通道,高宽为5
  7. x = tf.random.normal([2,5,5,3])
  8. # 需要根据[k,k,cin,cout]格式创建,4个卷积核
  9. w = tf.random.normal([3,3,3,4])
  10. # 步长为1, padding为0,即padding=[[0,0],[0,0],[0,0],[0,0]]
  11. out = tf.nn.conv2d(x,w, strides=1, padding=[[0,0],[0,0],[0,0],[0,0]])
  12. # 模拟输入,3通道,高宽为5
  13. x = tf.random.normal([2,5,5,3])
  14. # 需要根据[k,k,cin,cout]格式创建,4个卷积核
  15. w = tf.random.normal([3,3,3,4])
  16. # 步长为1, padding为1,即padding=[[0,0],[1,1],[1,1],[0,0]]
  17. out = tf.nn.conv2d(x,w, strides=1, padding=[[0,0],[1,1],[1,1],[0,0]])
  18. # 模拟输入,3通道,高宽为5
  19. x = tf.random.normal([2,5,5,3])
  20. # 需要根据[k,k,cin,cout]格式创建,4个3x3大小的卷积核
  21. w = tf.random.normal([3,3,3,4])
  22. # 步长为1,padding设置为输出、输入同大小,即padding='SAME'
  23. # 需要注意的是, padding='SAME'只有在strides=1时才是输出、输入同大小
  24. out = tf.nn.conv2d(x,w, strides=1, padding='SAME')
  25. # 模拟输入,3通道,高宽为5
  26. x = tf.random.normal([2,5,5,3])
  27. # 需要根据[k,k,cin,cout]格式创建,4个3x3大小的卷积核
  28. w = tf.random.normal([3,3,3,4])
  29. # strides=3:高宽按3倍减少
  30. # padding设置为输出、输入同大小,即padding='SAME'。
  31. # padding='SAME'只有在strides=1时才是输出、输入同大小。
  32. out = tf.nn.conv2d(x,w, strides=3, padding='SAME')
  33. print(out.shape)
  34. # 根据[cout]格式创建偏置向量
  35. b = tf.zeros([4])
  36. # 在卷积输出上叠加偏置向量,它会自动broadcasting为[b,h',w',cout]
  37. out = out + b
  38. # 创建卷积层类
  39. # padding设置为输出、输入同大小,即padding='SAME'。
  40. # padding='SAME'只有在strides=1时才是输出、输入同大小。
  41. layer = layers.Conv2D(4,kernel_size=(3,4),strides=(2,1),padding='SAME')
  42. out = layer(x) # 前向计算
  43. out.shape
  44. layer.kernel, layer.bias
  45. # 返回所有待优化张量列表
  46. layer.trainable_variables
  47. from tensorflow.keras import Sequential
  48. # 网络容器
  49. network = Sequential([
  50. layers.Conv2D(6,kernel_size=3,strides=1), # 第一个卷积层, 6个3x3卷积核
  51. layers.MaxPooling2D(pool_size=2,strides=2), # 高宽各减半的池化层
  52. layers.ReLU(), # 激活函数
  53. layers.Conv2D(16,kernel_size=3,strides=1), # 第二个卷积层, 16个3x3卷积核
  54. layers.MaxPooling2D(pool_size=2,strides=2), # 高宽各减半的池化层
  55. layers.ReLU(), # 激活函数
  56. layers.Flatten(), # 打平层,方便全连接层处理
  57. layers.Dense(120, activation='relu'), # 全连接层,120个节点
  58. layers.Dense(84, activation='relu'), # 全连接层,84节点
  59. layers.Dense(10) # 全连接层,10个节点
  60. ])
  61. # build一次网络模型,给输入X的形状,其中4为随意给的batchsz
  62. network.build(input_shape=(4, 28, 28, 1))
  63. # 统计网络信息
  64. network.summary()
  65. # 导入误差计算,优化器模块
  66. from tensorflow.keras import losses, optimizers
  67. # 创建损失函数的类,在实际计算时直接调用类实例即可
  68. criteon = losses.CategoricalCrossentropy(from_logits=True)
  69. # 构建梯度记录环境
  70. with tf.GradientTape() as tape:
  71. # 插入通道维度,=>[b,28,28,1]
  72. x = tf.expand_dims(x,axis=3)
  73. # 前向计算,获得10类别的预测分布,[b, 784] => [b, 10]
  74. out = network(x)
  75. # 真实标签one-hot编码,[b] => [b, 10]
  76. y_onehot = tf.one_hot(y, depth=10)
  77. # 计算交叉熵损失函数,标量
  78. loss = criteon(y_onehot, out)
  79. # 自动计算梯度
  80. grads = tape.gradient(loss, network.trainable_variables)
  81. # 自动更新参数
  82. optimizer.apply_gradients(zip(grads, network.trainable_variables))
  83. # 记录预测正确的数量,总样本数量
  84. correct, total = 0,0
  85. for x,y in db_test: # 遍历所有训练集样本
  86. # 插入通道维度,=>[b,28,28,1]
  87. x = tf.expand_dims(x,axis=3)
  88. # 前向计算,获得10类别的预测分布,[b, 784] => [b, 10]
  89. out = network(x)
  90. # 真实的流程时先经过softmax,再argmax
  91. # 但是由于softmax不改变元素的大小相对关系,故省去
  92. pred = tf.argmax(out, axis=-1)
  93. y = tf.cast(y, tf.int64)
  94. # 统计预测正确数量
  95. correct += float(tf.reduce_sum(tf.cast(tf.equal(pred, y),tf.float32)))
  96. # 统计预测样本总数
  97. total += x.shape[0]
  98. # 计算准确率
  99. print('test acc:', correct/total)

20200126165900343.png


" class="reference-link">池化层watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 25


" class="reference-link">BatchNorm 层watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 26

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 27

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 28

  1. # 构造输入
  2. x=tf.random.normal([100,32,32,3])
  3. # 将其他维度合并,仅保留通道维度
  4. x=tf.reshape(x,[-1,3])
  5. # 计算其他维度的均值,不计算通道维度
  6. ub=tf.reduce_mean(x,axis=0)
  7. ub
  8. # 创建BN层
  9. layer=layers.BatchNormalization()
  10. # 网络容器
  11. network = Sequential([
  12. layers.Conv2D(6,kernel_size=3,strides=1),
  13. # 插入BN层
  14. layers.BatchNormalization(),
  15. layers.MaxPooling2D(pool_size=2,strides=2),
  16. layers.ReLU(),
  17. layers.Conv2D(16,kernel_size=3,strides=1),
  18. # 插入BN层
  19. layers.BatchNormalization(),
  20. layers.MaxPooling2D(pool_size=2,strides=2),
  21. layers.ReLU(),
  22. layers.Flatten(),
  23. layers.Dense(120, activation='relu'),
  24. # 此处也可以插入BN层
  25. layers.Dense(84, activation='relu'),
  26. # 此处也可以插入BN层
  27. layers.Dense(10)
  28. ])
  29. with tf.GradientTape() as tape:
  30. # 插入通道维度
  31. x = tf.expand_dims(x,axis=3)
  32. # 前向计算,设置计算模式,[b, 784] => [b, 10]
  33. # BN需要设置training=True
  34. out = network(x, training=True)
  35. # 遍历测试集
  36. for x,y in db_test:
  37. # 插入通道维度
  38. x = tf.expand_dims(x,axis=3)
  39. # 前向计算,测试模式。BN需要设置training=True。
  40. out = network(x, training=False)
  41. import tensorflow as tf
  42. from tensorflow import keras
  43. from tensorflow.keras import layers, optimizers
  44. # 2 images with 4x4 size, 3 channels
  45. # we explicitly enforce the mean and stddev to N(1, 0.5)
  46. x = tf.random.normal([2,4,4,3], mean=1.,stddev=0.5)
  47. x.shape #TensorShape([2, 4, 4, 3])
  48. net = layers.BatchNormalization(axis=-1, center=True, scale=True, trainable=True)
  49. out = net(x)
  50. print('forward in test mode:', net.variables)
  51. #forward in test mode: [
  52. #<tf.Variable 'batch_normalization/gamma:0' shape=(3,) dtype=float32, numpy=array([1., 1., 1.], dtype=float32)>,
  53. #<tf.Variable 'batch_normalization/beta:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
  54. #<tf.Variable 'batch_normalization/moving_mean:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
  55. #<tf.Variable 'batch_normalization/moving_variance:0' shape=(3,) dtype=float32, numpy=array([1., 1., 1.], dtype=float32)>]
  56. out = net(x, training=True)
  57. print('forward in train mode(1 step):', net.variables)
  58. #forward in train mode(1 step): [
  59. #<tf.Variable 'batch_normalization/gamma:0' shape=(3,) dtype=float32, numpy=array([1., 1., 1.], dtype=float32)>,
  60. #<tf.Variable 'batch_normalization/beta:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
  61. #<tf.Variable 'batch_normalization/moving_mean:0' shape=(3,) dtype=float32, numpy=array([0.01059513, 0.01055362, 0.01071654], dtype=float32)>,
  62. #<tf.Variable 'batch_normalization/moving_variance:0' shape=(3,) dtype=float32, numpy=array([0.99315214, 0.99234647, 0.9939004 ], dtype=float32)>]
  63. for i in range(100):
  64. out = net(x, training=True)
  65. print('forward in train mode(100 steps):', net.variables)
  66. #forward in train mode(100 steps): [
  67. #<tf.Variable 'batch_normalization/gamma:0' shape=(3,) dtype=float32, numpy=array([1., 1., 1.], dtype=float32)>,
  68. #<tf.Variable 'batch_normalization/beta:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
  69. #<tf.Variable 'batch_normalization/moving_mean:0' shape=(3,) dtype=float32, numpy=array([0.6755756, 0.6729286, 0.6833168], dtype=float32)>,
  70. #<tf.Variable 'batch_normalization/moving_variance:0' shape=(3,) dtype=float32, numpy=array([0.5633595 , 0.51199085, 0.6110718 ], dtype=float32)>]
  71. #SGD随机梯度下降
  72. optimizer = optimizers.SGD(lr=1e-2)
  73. for i in range(10):
  74. with tf.GradientTape() as tape:
  75. out = net(x, training=True)
  76. loss = tf.reduce_mean(tf.pow(out,2)) - 1
  77. grads = tape.gradient(loss, net.trainable_variables)
  78. optimizer.apply_gradients(zip(grads, net.trainable_variables))
  79. print('backward(10 steps):', net.variables)
  80. #backward(10 steps): [
  81. #<tf.Variable 'batch_normalization/gamma:0' shape=(3,) dtype=float32, numpy=array([0.9355032 , 0.93557316, 0.935464 ], dtype=float32)>,
  82. #<tf.Variable 'batch_normalization/beta:0' shape=(3,) dtype=float32, numpy=array([ 7.4505802e-09, -4.2840842e-09, 5.2154064e-10], dtype=float32)>,
  83. #<tf.Variable 'batch_normalization/moving_mean:0' shape=(3,) dtype=float32, numpy=array([0.71228695, 0.70949614, 0.7204489 ], dtype=float32)>,
  84. #<tf.Variable 'batch_normalization/moving_variance:0' shape=(3,) dtype=float32, numpy=array([0.5396321 , 0.485472 , 0.58993715], dtype=float32)>]

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 29

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 30

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 31

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读