深層学習メモ: Tensorflow モデルの確立とトレーニング - 多層パーセプトロン MLP
Fashion-MNIST データセットについて
Zalando は、 MNISTデータ セットを Fashion-MNISTデータ セットに置き換え、機械学習データ セットとして Fashion-MINST を使用しました。
Fashion-MNIST データ セットは、衣類、靴、バッグの合計 70,000 枚の写真で構成されており、各写真のピクセル サイズは 28x28 で、グレースケールで表示されます。そのうち、60,000 枚の画像がトレーニングに使用され、10,000 枚の画像がテストに使用されます。
ファッション データ セットは 10 のカテゴリに分類でき、中国語では次のように表されます。
class_name = ["T シャツ"、"パンツ"、"パーカー"、"ドレス"、"コート"、"サンダル"、"シャツ"、 「スニーカー」「バッグ」「ブーツ」】
ファッションデータセットをロードする
このアプリケーションで使用されている Tensorflow のバージョンは 2.3.0 です。
- 必要なライブラリをインポートします
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model
import matplotlib.pyplot as plt - データセットをロードします #
トレーニング用の入力特徴とラベルを読み取ります
ファッション = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = ファッション.load_data()
説明:
x_train: 特徴データトレーニングセットのロードを示します。つまり、60,000 枚の画像トレーニング セット
y_train: 画像分類に対応するラベル トレーニング セットを表します。
x_test: ロードされた特徴データ テスト セット、つまり 10,000 枚の画像を含むテスト セットを表します。 y_test
: 画像に対応するラベル トレーニング セットを表します。分類
#入力特徴分類1を実現するため、値は[0, 1]となり、計算量が軽減されますピクチャはデフォルトで0~255の数値になり、ニューラルネットワークがx_train、x_testを吸収しやすくなり
ます= x_train/255.0, x_test/255.0
class_name = ["T シャツ ","パンツ","パーカー","ドレス","コート","サンダル","シャツ","スニーカー","バッグ","ブーツ"]
ニューラルネットワークを構築する
ニューラルネットワーククラスを定義する
tf.keras.Model のサブクラスであるニューラル ネットワーク モデル クラス FashionModel を定義します。
class FashionModel(Model):
# 定义网络结构
def __init__(self):
super(FashionModel, self).__init__()
#将数据拉直 [28,28]->[784,1]
self.flatten = Flatten()
#指定激活函数
self.d1 = Dense(128, activation="relu")
#指定激活函数,设置为[0,1]之间的数字
self.d2 = Dense(10, activation="softmax")
def call(self, inputs, training=None, mask=None):
x = self.flatten(inputs)
x = self.d1(x)
y = self.d2(x)
return y
上記のネットワークは、フラット化層、全結合層 d1、第 2 全結合層 d2 の 3 層に分かれています。
ニューラル ネットワークを定義して呼び出し、トレーニング セットとテスト セットをパラメーターとして渡します。
def generate_nn(x_train,y_train,x_test,y_test):
# 声明神经网络对象
model = FashionModel()
# 配置训练方法(优化器,损失函数,评测指标)
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.sparse_categorical_accuracy])
# 执行训练过程
model.fit(x_train, y_train,
batch_size=32, epochs=10,
validation_data=(x_test, y_test),
validation_freq=1)
# 打印网络结构和参数
model.summary()
return model
画像表示処理
def show_image(img_arr):
"""
显示图片
Parameters
----------
img_arr : numpy.ndarray
表示图片
"""
plt.imshow(img_arr,cmap="binary")
plt.show()
10枚の写真の分類を予測します
画像の場所:
画像の拡張子はjpegです
#创建模型
model = generate_nn(x_train,y_train,x_test,y_test)
#定义图片的存储位置
path = "./test_data/exam_fashion/exam_fashion/"
#图片的文件名,形如1.jpeg
images = ["%d.jpeg"%i for i in range(0,10)]
#生成28x28的图片数组
matrix = np.full(784,255.0).reshape(28,28)
images_data=[]
for imgfile in images:
#设置要访问的图片文件名
img_name = "%s%s"%(path,imgfile)
#加载图片
img = tf.keras.preprocessing.image.load_img(img_name,color_mode="grayscale",target_size=(28,28))
img_data = tf.keras.preprocessing.image.img_to_array(img) #将图片数据转换成numpy数组
img_data = matrix-img_data.reshape(28,28) #图片反相处理,黑变白,白变黑,将数组设置为28x28
show_image(img_data) #显示图片
images_data.append(img_data)
def main():
images_data = np.array(images_data)
y_pred = model.predict(images_data) #预测的结果
index = np.argmax(y_pred,axis=1) #获取预测的结果,返回二位数组的 列坐标对应的分类
for i in index: #显示最后的结果
print(i,class_name[i])
if __name__=="__main__":
main()
テスト結果:
6 シャツ
1 パンツ
4 ジャケット
3 ドレス
4 ジャケット
5 サンダル
0 T シャツ
7 スニーカー
8 バッグ
9 ブーツ