实验环境
默认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变体网络.