这个作业和L2W3的区别是:这个用的是卷积网络对图像进行分类,L2W3用的是传统全连接神经网络进行分类,数据集一样,实验结果是使用卷积神经网络处理这个数据集的准确性达到了百分之百(测试集略低,有点过拟合,不过相较于使用全连接神经网络好多了),果然图像的事还是交给卷积来比较好。
import tensorflow as tf
from PIL import Image
from tf_utils import *
import matplotlib.pyplot as plt
print(tf.__version__)
class LossHistory(tf.keras.callbacks.Callback):
def on_train_begin(self, logs=None):
self.losses = []
def on_epoch_end(self, epoch, logs=None):
self.losses.append(logs['loss'])
def loss_callback(epoch, logs):
loss = logs['loss']
print('Epoch {}: Loss = {}'.format(epoch, loss.numpy()))
# 加载数据
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
print(X_train_orig.shape)
print(Y_train_orig.shape)
# 将数据归一化
X_train_orig=X_train_orig/255.0
X_test_orig=X_test_orig/255.0
# 转换标签的形状
Y_train_orig=Y_train_orig.T
Y_train_orig=np.squeeze(Y_train_orig)
Y_test_orig=Y_test_orig.T
Y_test_orig=np.squeeze(Y_test_orig)
# 显示图像
# plt.figure(figsize=(10,10))
# for i in range(25):
# plt.subplot(5,5,i+1)
# plt.xticks([])
# plt.yticks([])
# plt.grid(False)
# plt.imshow(X_train_orig[i])
# plt.xlabel(Y_train_orig[i])
# plt.show()
# 创建模型
model=tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(64,64,3)))
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Conv2D(64,(5,5),activation='relu'))
# 以下是全连接层
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(32,activation='relu'))
model.add(tf.keras.layers.Dense(6))
# model.summary()
# # 编译模型
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
# # 设置自定义回调函数
loss_history = LossHistory()
# # 训练模型
model.fit(X_train_orig,Y_train_orig,epochs=50,validation_data=(X_test_orig,Y_test_orig),callbacks=[loss_history])
# # 将损失值转换为 NumPy 数组
losses_np = np.array(loss_history.losses)
plt.plot(losses_np)
plt.show()
# # 保存模型
model.save("model.h5")
# 预测自己的照片
# 加载模型
# model=tf.keras.models.load_model("F:\\Desktop\\pythonworkspace\\Deep_learning\\L4W1\\work2\\model.h5")
# # 给模型添加一个softmax层
# model.add(tf.keras.layers.Softmax())
# # 加载自己的照片
# path="data\input_picture.jpg"
# img=tf.keras.preprocessing.image.load_img(path)
# img_arry=tf.keras.preprocessing.image.img_to_array(img)
# img_arry=np.expand_dims(img_arry,axis=0)
# predict=model.predict(img_arry)
# print(np.argmax(predict))
自己的拍的照片
结果:
结果为2,说明预测正确