对图像进行分类。
1.数据预处理
2.建立模型
3.编译模型
4.训练模型
5.模型预测
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
print(train_images.shape)
print(len(train_images))
#plt.figure(1)
#plt.imshow(train_images[1])
#plt.colorbar()
#plt.grid(False)
#plt.show()
#像素大小弄到0~1
#plt.figure(2)
#plt.imshow(a[1])
#plt.grid(False)
#plt.colorbar()
#plt.show()
train_images = train_images / 255.0
test_images = test_images / 255.0
#1.搭建模型
model = keras.Sequential(
[
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128,activation="relu"),
keras.layers.Dense(10,activation="softmax")
]
)
#下面这是什么啊
#2.编译创建好的模型
model.compile(optimizer='adam', #optimizer用来指定优化方式
loss='sparse_categorical_crossentropy', #loss 用来指定损失函数
metrics=['accuracy']) # metrics 列表类型 指定衡量模型的指标
#3.训练模型
model.fit(train_images,train_labels,epochs = 10)
#4.预测
test_loss ,test_acc = model.evaluate(test_images,test_labels)
print("预测准确率:",test_acc)
predictions = model.predict(test_images)
#预测某张图片就用predictions[x] x是下标
#prediction[x]会返回一个array,他们代表着是哪一类的概率,哪个数字最大,就是被分到了哪一类
#np.argmax(predictions[0])
np.argmax(predictions[0])
数据预处理之前呢,把图像从0~255归到0~1再进入网络。
归一化是为了加快训练网络的收敛性,可以不进行归一化处理;
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。
但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。
参考:https://blog.csdn.net/qq_41383956/article/details/88593538