服务热线
135-6963-3175
数据预处理和训练:
import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt # 加载Fashion MNIST数据集 (train_images, train_labels), (test_images, test_labels) = keras.datasets.fashion_mnist.load_data() class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # 数据预处理 train_images = train_images / 255.0 test_images = test_images / 255.0 # 构建模型 inputs = keras.Input(shape=(28, 28)) x = keras.layers.Flatten()(inputs) x = keras.layers.Dense(128, activation='relu')(x) outputs = keras.layers.Dense(10)(x) model = keras.Model(inputs=inputs, outputs=outputs) # 编译模型 model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy']) # 训练模型 history = model.fit(train_images, train_labels, epochs=100, validation_data=(test_images, test_labels)) # 保存模型(保存模型结构与权重) model.save('./save/model.h5') # 加载模型(同时加载模型结构与权重) loaded_model = keras.models.load_model('./save/model.h5') # 评估模型(计算并打印准确率) test_loss, test_acc = loaded_model.evaluate(test_images, test_labels, verbose=2) print('\n测试结果:', test_acc)
推理:
import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt from PIL import Image import os; import matplotlib.pyplot as plt import cv2 # 定义类别名称列表 class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() # 加载已训练的模型 model = keras.models.load_model('./save/model.h5') # 加载图像并进行预处理 image = Image.open('./900.webp') #图像展示 plt.figure() plt.imshow(image) plt.colorbar() plt.grid(False) plt.show() #转换为单通道图像 #image = image.convert('L') image = image.convert('1') image = image.resize((28, 28)) # 调整图像大小为28x28像素 image = np.array(image) # 转换为NumPy数组 image = image / 255.0 #检测展示 plt.figure(figsize=(10,10)) plt.subplot(5,5,0+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(image, cmap=plt.cm.binary) plt.xlabel(class_names[0]) plt.show() image = image.reshape(-1, 28, 28) # 调整图像形状为(1, 784) #img=test_images[1] #print(img.shape) #img = (np.expand_dims(img,0)) # 进行预测 predictions = model.predict(image) predicted_label = np.argmax(predictions[0]) predicted_class = class_names[predicted_label] # 打印预测结果 print('预测标签:', predicted_label) print('预测类别:', predicted_class)
模型创建代码详解
inputs = keras.Input(shape=(28, 28)) x = keras.layers.Flatten()(inputs) x = keras.layers.Dense(128, activation='relu')(x) outputs = keras.layers.Dense(10)(x) model = keras.Model(inputs=inputs, outputs=outputs)
这段代码定义了一个与上面的模型不同的神经网络结构。让我逐行解释代码的作用:
1. `inputs = keras.Input(shape=(28, 28))`:创建一个输入层,指定输入数据的形状为(28, 28)。这表示输入数据是一个28x28的二维图像。
2. `x = keras.layers.Flatten()(inputs)`:将输入层展平为一维向量。Flatten层用于将多维的输入数据转换为一维向量形式,以便后续的全连接层处理。
3. `x = keras.layers.Dense(128, activation='relu')(x)`:添加一个具有128个神经元的全连接层,并使用ReLU激活函数。这一层将接收展平后的输入数据,并产生128维的特征表示。
4. `outputs = keras.layers.Dense(10)(x)`:添加一个具有10个神经元的输出层。这一层没有指定激活函数,因此默认为线性激活函数。输出层的神经元数量为10,适用于进行10类的分类任务。
5. `model = keras.Model(inputs=inputs, outputs=outputs)`:创建一个模型对象,指定输入层和输出层。这里使用了Functional API的方式构建模型,通过指定输入和输出层来定义模型的结构。
总的来说,这段代码构建的模型适用于处理图像数据,并进行分类任务。输入是28x28的图像,经过展平和全连接层的处理后,通过输出层得到对不同类别的分类预测结果。