Tensorflow学习&深度学习实操(2)

本文最后更新于:2024年3月7日 下午

投了算法岗的简历,写到了了解一些深度学习相关的内容,便复习了一下

Fashion MNIST数据集

可以看作是minist的升级版,由于minist过于简单,初学者都能跑出准确率很高的模型,因此有大佬推出了Fashion MNIST数据集
paper 地址: https://arxiv.org/abs/1708.07747
GitHub地址:https://github.com/zalandoresearch/fashion-mnist
每张图片都是服饰的灰度图,数据格式是(60000,28,28)。其中四分之三为训练集,四分之一为测试集。
有很多调用的方式,tensorflow自带这一数据集,因此可以直接使用:fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

数据集不带标签,只是有0·9 9个数字,因此需要自己打上:

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

模型

构建的模型有2层卷积层,两层全连接层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
model = keras.Sequential([
keras.layers.Conv2D(64, kernel_size=2, strides=(1,1),padding='same', activation='relu',input_shape=(28,28,1)),
keras.layers.MaxPool2D(pool_size=(2, 2),strides=None,padding='same'),
keras.layers.Dropout(0.3),

keras.layers.Conv2D(32, kernel_size=3, strides=(1,1),padding='same', activation='relu'),
keras.layers.MaxPool2D(pool_size=(2, 2),strides=None,padding='same'),
keras.layers.Dropout(0.3),
keras.layers.BatchNormalization(),

keras.layers.Flatten(),
keras.layers.Dense(256, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')
])#构建模型

*也有试过其他的结构,有个据称能做到97%准确率的网络(6层卷积4层全连接)在我机子上训练极尽死机,用了gpu服务(免费)然后由于可用ram占满训练失败,最终确立了这个结构

以及关于数据维度的问题,起初在调网络结构的时候一直提示我输入维度不对,查了之后才发现tensorflow卷积层的维度需要是四个以上,因此需要给数据补充一维(好像应该放到数据处理里)

1
2
train_images = tf.expand_dims(train_images,(int)(-1))#增加数据维度
test_images = tf.expand_dims(test_images,(int)(-1))

改结构的时候加了池化层后就一直说要输入4个不能输入五个,我想他也没五维啊然后又是查半天错,最后是发现自己在第一层的卷积层的input_shape将维度直接写了四维input_shape=(1,28,28,64),但是由于数据集是28*28一张的,所以他会自动忽略1这一维然后进行运算,但是由于运算需要至少四维所以他会自动补全一维,造成卷积层到池化层就是五维的数据。

模型的编译及训练指令:

1
2
3
4
5
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])#模型编译指令
model.fit(train_images, train_labels, epochs=10,batch_size=1000, validation_split=0.2, verbose=1)#模型训练指令
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

输出测试集的准确率以及存下模型
1
2
3
print('\nTest accuracy:', test_acc)
#checkpoint_path = "E:/file/tensorflow file/model.ckptt"
model.save('E:/file/tensorflow file/model.ckptt')

需要的时候直接导出进行训练或者直接预测model = tf.keras.models.load_model('E:/file/tensorflow file/model.ckptt')
预测并作图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

probability_model = tf.keras.Sequential([model,tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

print('\nTest accuracy:', test_acc)

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[i], test_labels, test_images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

关于作图由我直接用的官网上的代码,放在了pltshow.py里,需要用的时候直接导入就行from pltshow import plot_image,plot_value_array
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
import matplotlib.pyplot as plt

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array, true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])

plt.imshow(img, cmap=plt.cm.binary)

predicted_label = np.argmax(predictions_array)
if predicted_label == true_label:
color = 'blue'
else:
color = 'red'

plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
100*np.max(predictions_array),
class_names[true_label]),
color=color)

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

thisplot[predicted_label].set_color('red')
thisplot[true_label].set_color('blue')


训练许久之后最终模型的准确率达到了92.9%,大概就是这样
结果如图
这是我的模型以及其他文件