Tensorflow2.0环境下基于微型残差网络(small resnet)的cifar10分类

实验环境

默认Notebook多引擎,Python3.7
TensorFlow-2.0

数据集准备

数据集说明

CIFAR-10,该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图。
在这里插入图片描述

数据集下载

(x_train, y_train),(x_test, y_test) = tf.keras.datasets.cifar10.load_data()

直接下载就行,数据集共有60000张彩色图像,训练集和测试集已经分好类,无需预处理。

微型残差网络模型构建

# 构建网络结构模型
inputs=tf.keras.Input(shape=(32,32,3),name='img')
h1=tf.keras.layers.Conv2D(32, 3, activation='relu')(inputs)
h1 = tf.keras.layers.Conv2D(64, 3, activation='relu')(h1)
block1_out = tf.keras.layers.MaxPooling2D(3)(h1)

h2 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(block1_out)
h2 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(h2)
block2_out = tf.keras.layers.add([h2, block1_out])

h3 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(block2_out)
h3 = tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same')(h3)
block3_out = tf.keras.layers.add([h3, block2_out])

h4 = tf.keras.layers.Conv2D(64, 3, activation='relu')(block3_out)
h4 = tf.keras.layers.GlobalMaxPool2D()(h4)
h4 = tf.keras.layers.Dense(256, activation='relu')(h4)
h4 = tf.keras.layers.Dropout(0.5)(h4)
outputs = tf.keras.layers.Dense(10, activation='softmax')(h4)

model = tf.keras.Model(inputs, outputs, name='small resnet')
# 观察网络结构
model.summary()

在这里插入图片描述

模型训练及预测

x_train = x_train / 255.
x_test = x_test/ 255.
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

model.compile(optimizer=tf.keras.optimizers.RMSprop(1e-3),
             loss='categorical_crossentropy',
             metrics=['acc'])
model.fit(x_train, y_train,
         batch_size=64,
         epochs=100,
         validation_split=0.2)

Train on 40000 samples, validate on 10000 samples
40000/40000 [==============================] - 314s 8ms/sample - loss: 1.1738 - acc: 0.5841 - val_loss: 1.0469 - val_acc: 0.6267
<tensorflow.python.keras.callbacks.History at 0x2a304594d68>

上图是我epochs选择1的结果,分类准确率并不高,便停止了迭代,为了更好地效果,你的epochs应该选择的更大,代码部分给出了100的参考值。

print(x_train.shape,x_test.shape)
loss,accuracy= model.evaluate(x_test, y_test, verbose=0)
predictions = model.predict(x_test, batch_size=32)
print('test loss:', loss)
print('test accuracy:', accuracy)
// An highlighted block
var foo = 'bar';

(50000, 32, 32, 3) (10000, 32, 32, 3)
test loss: 1.0615770408630372
test accuracy: 0.7155

结果可视化

def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  img=img.reshape(32, 32, 3)
  plt.imshow(img, cmap=plt.cm.binary)
  predicted_label = np.argmax(predictions_array)
  plt.xlabel('实际值:%s(预测值:%s)'%(class_names[np.argmax(true_label)],class_names[np.argmax(predictions_array)]))
          

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array[i], true_label[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777") 

  
  plt.ylim([0, 1]) 
  predicted_label = np.argmax(predictions_array)
  plt.xlabel("{}的概率为:{}".format("%.2f%%" % ((np.max(predictions_array)) * 100),class_names[np.argmax(predictions_array)]))
  
  thisplot[np.argmax(predictions_array)].set_color('red')
  thisplot[np.argmax(true_label)].set_color('blue')    

i = 41
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions , y_test, x_test)

plt.subplot(1,2,2)
plot_value_array(i, predictions,y_test)
plt.show()

在这里插入图片描述

num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions, y_test, x_test)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions, y_test)
plt.show()

在这里插入图片描述
原创不易,如果感觉这篇文章对你有帮助的话,还请点赞收藏哦

CIFAR-10数据集参考: CIFAR-10数据集说明- 从菜鸟开始- 博客园.
微型残差网络参考: CNN变体网络.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值