经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
ResNet实战
来源:cnblogs  作者:咸鱼Chen  时间:2019/6/3 8:42:31  对本文有异议

40-ResNet实战-basicblock.jpg

  1. # Resnet.py
  2. #!/usr/bin/env python
  3. # -*- coding:utf-8 -*-
  4. import tensorflow as tf
  5. from tensorflow import keras
  6. from tensorflow.keras import layers, Sequential
  7. class BasicBlock(layers.Layer):
  8. def __init__(self, filter_num, stride=1):
  9. super(BasicBlock, self).__init__()
  10. self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
  11. self.bn1 = layers.BatchNormalization()
  12. self.relu = layers.Activation('relu')
  13. self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding='same')
  14. self.bn2 = layers.BatchNormalization()
  15. if stride != 1:
  16. self.downsample = Sequential()
  17. self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride))
  18. else:
  19. self.downsample = lambda x: x
  20. def call(self, inputs, training=None):
  21. # [b,h,w,c]
  22. out = self.conv1(inputs)
  23. out = self.bn1(out)
  24. out = self.relu(out)
  25. out = self.conv2(out)
  26. out = self.bn2(out)
  27. identity = self.downsample(inputs)
  28. output = layers.add([out, identity])
  29. output = tf.nn.relu(output)
  30. return out

Res Block

40-ResNet实战-resblock.jpg

ResNet18

40-ResNet实战-resnet18.jpg

  1. # Resnet.py
  2. #!/usr/bin/env python
  3. # -*- coding:utf-8 -*-
  4. import tensorflow as tf
  5. from tensorflow import keras
  6. from tensorflow.keras import layers, Sequential
  7. class BasicBlock(layers.Layer):
  8. def __init__(self, filter_num, stride=1):
  9. super(BasicBlock, self).__init__()
  10. self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=stride, padding='same')
  11. self.bn1 = layers.BatchNormalization()
  12. self.relu = layers.Activation('relu')
  13. self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding='same')
  14. self.bn2 = layers.BatchNormalization()
  15. if stride != 1:
  16. self.downsample = Sequential()
  17. self.downsample.add(layers.Conv2D(filter_num, (1, 1), strides=stride))
  18. else:
  19. self.downsample = lambda x: x
  20. def call(self, inputs, training=None):
  21. # [b,h,w,c]
  22. out = self.conv1(inputs)
  23. out = self.bn1(out)
  24. out = self.relu(out)
  25. out = self.conv2(out)
  26. out = self.bn2(out)
  27. identity = self.downsample(inputs)
  28. output = layers.add([out, identity])
  29. output = tf.nn.relu(output)
  30. return out
  31. class ResNet(keras.Model):
  32. def __init__(self, layer_dims, num_classes=100): # [2,2,2,2]
  33. super(ResNet, self).__init__()
  34. # 根部
  35. self.stem = Sequential([layers.Conv2D(64, (3, 3), strides=(1, 1,)),
  36. layers.BatchNormalization(),
  37. layers.Activation('relu'),
  38. layers.MaxPool2D(pool_size=(2, 2), strides=(1, 1), padding='same')
  39. ])
  40. # 64,128,256,512是通道数
  41. self.layer1 = self.build_resblock(64, layer_dims[0])
  42. self.layer2 = self.build_resblock(128, layer_dims[1], stride=2)
  43. self.layer3 = self.build_resblock(256, layer_dims[2], stride=2)
  44. self.layer4 = self.build_resblock(512, layer_dims[3], stride=2)
  45. # output: [b, 512, h, w]
  46. self.avgpool = layers.GlobalAveragePooling2D()
  47. self.fc = layers.Dense(num_classes) # 分类
  48. def call(self, inputs, training=None):
  49. x = self.stem(inputs)
  50. x = self.layer1(x)
  51. x = self.layer2(x)
  52. x = self.layer3(x)
  53. x = self.layer4(x)
  54. # [b, c]
  55. x = self.avgpool(x)
  56. # [b]
  57. x = self.fc(x)
  58. return x
  59. def build_resblock(self, filter_num, blocks, stride=1):
  60. res_blocks = Sequential()
  61. # may down sample
  62. res_blocks.add(BasicBlock(filter_num, stride))
  63. for _ in range(1, blocks):
  64. res_blocks.add(BasicBlock(filter_num, stride=1))
  65. return res_blocks
  66. def resnet18():
  67. return ResNet([2, 2, 2, 2])
  68. def resnet34():
  69. return ResNet([3, 4, 6, 3])
  1. # resnet18_train.py
  2. #!/usr/bin/env python
  3. # -*- coding:utf-8 -*-
  4. import tensorflow as tf
  5. from tensorflow.keras import layers, optimizers, datasets, Sequential
  6. import os
  7. from Resnet import resnet18
  8. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
  9. tf.random.set_seed(2345)
  10. def preprocess(x, y):
  11. # [-1~1]
  12. x = tf.cast(x, dtype=tf.float32) / 255. - 0.5
  13. y = tf.cast(y, dtype=tf.int32)
  14. return x, y
  15. (x, y), (x_test, y_test) = datasets.cifar100.load_data()
  16. y = tf.squeeze(y, axis=1)
  17. y_test = tf.squeeze(y_test, axis=1)
  18. print(x.shape, y.shape, x_test.shape, y_test.shape)
  19. train_db = tf.data.Dataset.from_tensor_slices((x, y))
  20. train_db = train_db.shuffle(1000).map(preprocess).batch(512)
  21. test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
  22. test_db = test_db.map(preprocess).batch(512)
  23. sample = next(iter(train_db))
  24. print('sample:', sample[0].shape, sample[1].shape,
  25. tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))
  26. def main():
  27. # [b, 32, 32, 3] => [b, 1, 1, 512]
  28. model = resnet18()
  29. model.build(input_shape=(None, 32, 32, 3))
  30. model.summary()
  31. optimizer = optimizers.Adam(lr=1e-3)
  32. for epoch in range(500):
  33. for step, (x, y) in enumerate(train_db):
  34. with tf.GradientTape() as tape:
  35. # [b, 32, 32, 3] => [b, 100]
  36. logits = model(x)
  37. # [b] => [b, 100]
  38. y_onehot = tf.one_hot(y, depth=100)
  39. # compute loss
  40. loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)
  41. loss = tf.reduce_mean(loss)
  42. grads = tape.gradient(loss, model.trainable_variables)
  43. optimizer.apply_gradients(zip(grads, model.trainable_variables))
  44. if step % 50 == 0:
  45. print(epoch, step, 'loss:', float(loss))
  46. total_num = 0
  47. total_correct = 0
  48. for x, y in test_db:
  49. logits = model(x)
  50. prob = tf.nn.softmax(logits, axis=1)
  51. pred = tf.argmax(prob, axis=1)
  52. pred = tf.cast(pred, dtype=tf.int32)
  53. correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)
  54. correct = tf.reduce_sum(correct)
  55. total_num += x.shape[0]
  56. total_correct += int(correct)
  57. acc = total_correct / total_num
  58. print(epoch, 'acc:', acc)
  59. if __name__ == '__main__':
  60. main()
  1. (50000, 32, 32, 3) (50000,) (10000, 32, 32, 3) (10000,)
  2. sample: (512, 32, 32, 3) (512,) tf.Tensor(-0.5, shape=(), dtype=float32) tf.Tensor(0.5, shape=(), dtype=float32)
  3. Model: "res_net"
  4. _________________________________________________________________
  5. Layer (type) Output Shape Param #
  6. =================================================================
  7. sequential (Sequential) multiple 2048
  8. _________________________________________________________________
  9. sequential_1 (Sequential) multiple 148736
  10. _________________________________________________________________
  11. sequential_2 (Sequential) multiple 526976
  12. _________________________________________________________________
  13. sequential_4 (Sequential) multiple 2102528
  14. _________________________________________________________________
  15. sequential_6 (Sequential) multiple 8399360
  16. _________________________________________________________________
  17. global_average_pooling2d (Gl multiple 0
  18. _________________________________________________________________
  19. dense (Dense) multiple 51300
  20. =================================================================
  21. Total params: 11,230,948
  22. Trainable params: 11,223,140
  23. Non-trainable params: 7,808
  24. _________________________________________________________________
  25. WARNING: Logging before flag parsing goes to stderr.
  26. W0601 16:59:57.619546 4664264128 optimizer_v2.py:928] Gradients does not exist for variables ['sequential_2/basic_block_2/sequential_3/conv2d_7/kernel:0', 'sequential_2/basic_block_2/sequential_3/conv2d_7/bias:0', 'sequential_4/basic_block_4/sequential_5/conv2d_12/kernel:0', 'sequential_4/basic_block_4/sequential_5/conv2d_12/bias:0', 'sequential_6/basic_block_6/sequential_7/conv2d_17/kernel:0', 'sequential_6/basic_block_6/sequential_7/conv2d_17/bias:0'] when minimizing the loss.
  27. 0 0 loss: 4.60512638092041

Out of memory

    1. decrease batch size
    1. tune resnet[2,2,2,2]
    1. try Google CoLab
    1. buy new NVIDIA GPU Card

原文链接:http://www.cnblogs.com/nickchen121/p/10960206.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号