小言_互联网的博客

TensorFlow实战之CIFAR自定义网络

207人阅读  评论(0)

CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像,有50000个训练图像和10000个测试图像。

以下代码实现基于tensorflow对此数据集的训练和验证,采用的是自定义的网络,并把相应的参数(权重)保存起来


  
  1. import tensorflow as tf
  2. from tensorflow import keras
  3. from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics
  4. import os
  5. # 避免出现一些不必要的警告
  6. os.environ[ 'TF_CPP_MIN_LOG_LEVEL'] = '2'
  7. def preprocess(x, y):
  8. # [0,255] => [-1 ,1]
  9. x = 2 *tf.cast(x, dtype=tf.float32) / 255. - 1.
  10. y = tf.cast(y, dtype=tf.int32)
  11. return x, y
  12. batchsz = 128
  13. # [32, 32, 3], [10k, 1]
  14. (x, y), (x_val, y_val) = datasets.cifar10.load_data()
  15. y = tf.squeeze(y) # [10k]
  16. y_val = tf.squeeze(y_val)
  17. y = tf.one_hot(y, depth= 10) # [50k,10]
  18. y_val = tf.one_hot(y_val, depth= 10) # [10k, 10]
  19. print(x.shape, y.shape, x_val.shape, y_val.shape)
  20. # 数据集预处理
  21. train_db = tf.data.Dataset.from_tensor_slices((x, y))
  22. train_db = train_db.map(preprocess).shuffle( 10000).batch(batchsz)
  23. test_db = tf.data.Dataset.from_tensor_slices((x_val, y_val))
  24. test_db = test_db.map(preprocess).batch(batchsz)
  25. # sample一个对象看它的shape,是不是和想的一样
  26. sample = next(iter(train_db))
  27. print( 'batch:', sample[ 0].shape, sample[ 1].shape)
  28. # 继承
  29. class MyDense(layers.Layer):
  30. # 继承函数
  31. # to replace standard layers.Dense()
  32. def __init__(self, inp_dim, outp_dim):
  33. # 初始化函数
  34. super(MyDense, self).__init__()
  35. self.kernel = self.add_variable( 'w', [inp_dim, outp_dim])
  36. # self.bias = self.add_variable('b', [outp_dim])
  37. def call(self, inputs, training=None):
  38. x = inputs @ self.kernel
  39. return x
  40. class MyNetwork(keras.Model):
  41. def __init__(self):
  42. super(MyNetwork, self).__init__()
  43. self.fc1 = MyDense( 32 * 32 * 3, 256)
  44. self.fc2 = MyDense( 256, 128)
  45. self.fc3 = MyDense( 128, 64)
  46. self.fc4 = MyDense( 64, 32)
  47. self.fc5 = MyDense( 32, 10)
  48. def __call__(self, inputs, training=None):
  49. """
  50. :param inputs:[b,32,32,3]
  51. :param training:
  52. :return:
  53. """
  54. x = tf.reshape(inputs, [ -1, 32 * 32 * 3])
  55. # [b, 32*32*3] => [b, 256]
  56. x = self.fc1(x)
  57. x = tf.nn.relu(x)
  58. # [b, 256] => [b, 128]
  59. x = self.fc2(x)
  60. x = tf.nn.relu(x)
  61. # [b, 128] => [b, 64]
  62. x = self.fc3(x)
  63. x = tf.nn.relu(x)
  64. # [b, 64] => [b, 32]
  65. x = self.fc4(x)
  66. x = tf.nn.relu(x)
  67. # [b, 32] => [b, 10]
  68. x = self.fc5(x)
  69. return x
  70. network = MyNetwork()
  71. network.compile(optimizers=optimizers.Adam(lr= 1e-3),
  72. loss=tf.losses.CategoricalCrossentropy(from_logits= True),
  73. metrics=[ 'accuracy'])
  74. network.fit(train_db, epochs= 10, validation_data=test_db, validation_freq= 1)
  75. # 把训练好的模型保存下来
  76. network.evaluate(test_db)
  77. network.save_weights( 'ckpt/weights.ckpt')
  78. del network
  79. print( 'saved to ckpt/weights.ckpt')
  80. network = MyNetwork()
  81. network.compile(optimizers=optimizers.Adam(lr= 1e-3),
  82. loss=tf.losses.CategoricalCrossentropy(from_logits= True),
  83. metrics=[ 'accuracy'])
  84. network.load_weights( 'ckpt/weights.ckpt')
  85. print( 'loaded weights from file.')
  86. network.evaluate(test_db)

 

实现结果如下

可见准确率只有50%左右,在没有使用CNN情况下,这是很正常的,后续还会更新采用CNN进行此数据集的训练

如下模型的权重加载,准确率也是在50%左右,没有问题

 

可以在文件夹中查看权重保存的位置


转载:https://blog.csdn.net/qq_42593798/article/details/115712447
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场