ディレクトリ
入力データ
ここでは、本明細書の手書き数字認識に衣服に、この単純な認識だった以前のものとは異なり、例えば、まだMNISTデータでした。
最初のステップは、次のことを達成するために、データ、データ及び公式チュートリアル、特定のコードtensorflowから該当するコードを入力することです。
from __future__ import absolute_import, division, print_function, unicode_literals #这一句一定放在第一行,否则系统提示错误
# 忽略系统的警告信息
import warnings
warnings.filterwarnings('ignore')
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
#下载fashion_mnist服装分类数据集,并将相应数据添加进入对应的测试及训练图像和标签
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
単純にデータセットをダウンロードするには、上記に見えることはまず解析された写真を見て、何かです。以下に示すように、データセットは、トレーニングセット、検証機、及び良好なタグラベルを含む、データ・エントリ・レベルの画像認識画像データベースです。
しかし〜データが処理tensorflow「テンソル」形式であるため、これらの写真は、実際にどのような形で、私たちは、12以下のコードを垣間見ることができます
train_images.shape #训练数据的格式,训练数据共有60000张图片,每张图片由28*28像素大小的图片组成
len(train_images) #训练数据的长度
len(train_labels) #训练数据标签长度,这里与训练数据图像数量相等
(60000, 28, 28)
60000
60000
データのトレーニングデータセットを、例えば、60000枚のピクチャの合計データを訓練するために、各画像は、適切な標識、28 * 28ピクセルの画像合成であり、トレーニングデータが60000であります
train_labels #训练标签的数据格式
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8) #共有60000组标签,取值范围0-9,分别对应十类服装类型
衣類の10種類に対応する、0~9の範囲のデータタグの60,000トレーニングセットの合計
train_images #训练图片的数据格式
array([[[0, 0, 0, ..., 0, 0, 0], #60000组数据,每组数据包含784个像素点(28*28)
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
...,
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)
60,000テンソルの60000形式トレーニングデータセットは、各群の量は、28 * 28からなる張二次元アレイです。
データ処理
トレーニングネットワークには、事前にデータを前処理する必要があります。0から255の間の画素データの現在の値は、異なるディメンションデータのうち結束は、データが正規化されている、データおよびその後の計算を分析するために、私たちを助けます。私たちは、処理の前に支配的な現在のデータを見ることができます。
# 利用tensorflow的绘图工具将图片显示出来
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
現在の画像の画素から見た図0-255の間で分配されます。
print(train_images[0]) 显示图1的数据格式,与图像互相对应
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 13 73 0
0 1 4 0 0 0 0 1 1 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 3 0 36 136 127 62
54 0 0 0 1 3 4 0 0 3]
[ 0 0 0 0 0 0 0 0 0 0 0 0 6 0 102 204 176 134
144 123 23 0 0 0 0 12 10 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 236 207 178
107 156 161 109 64 23 77 130 72 15]
[ 0 0 0 0 0 0 0 0 0 0 0 1 0 69 207 223 218 216
216 163 127 121 122 146 141 88 172 66]
[ 0 0 0 0 0 0 0 0 0 1 1 1 0 200 232 232 233 229
223 223 215 213 164 127 123 196 229 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 183 225 216 223 228
235 227 224 222 224 221 223 245 173 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 193 228 218 213 198
180 212 210 211 213 223 220 243 202 0]
[ 0 0 0 0 0 0 0 0 0 1 3 0 12 219 220 212 218 192
169 227 208 218 224 212 226 197 209 52]
[ 0 0 0 0 0 0 0 0 0 0 6 0 99 244 222 220 218 203
198 221 215 213 222 220 245 119 167 56]
[ 0 0 0 0 0 0 0 0 0 4 0 0 55 236 228 230 228 240
232 213 218 223 234 217 217 209 92 0]
[ 0 0 1 4 6 7 2 0 0 0 0 0 237 226 217 223 222 219
222 221 216 223 229 215 218 255 77 0]
[ 0 3 0 0 0 0 0 0 0 62 145 204 228 207 213 221 218 208
211 218 224 223 219 215 224 244 159 0]
[ 0 0 0 0 18 44 82 107 189 228 220 222 217 226 200 205 211 230
224 234 176 188 250 248 233 238 215 0]
[ 0 57 187 208 224 221 224 208 204 214 208 209 200 159 245 193 206 223
255 255 221 234 221 211 220 232 246 0]
[ 3 202 228 224 221 211 211 214 205 205 205 220 240 80 150 255 229 221
188 154 191 210 204 209 222 228 225 0]
[ 98 233 198 210 222 229 229 234 249 220 194 215 217 241 65 73 106 117
168 219 221 215 217 223 223 224 229 29]
[ 75 204 212 204 193 205 211 225 216 185 197 206 198 213 240 195 227 245
239 223 218 212 209 222 220 221 230 67]
[ 48 203 183 194 213 197 185 190 194 192 202 214 219 221 220 236 225 216
199 206 186 181 177 172 181 205 206 115]
[ 0 122 219 193 179 171 183 196 204 210 213 207 211 210 200 196 194 191
195 191 198 192 176 156 167 177 210 92]
[ 0 0 74 189 212 191 175 172 175 181 185 188 189 188 193 198 204 209
210 210 211 188 188 194 192 216 170 0]
[ 2 0 0 0 66 200 222 237 239 242 246 243 244 221 220 193 191 179
182 182 181 176 166 168 99 58 0 0]
[ 0 0 0 0 0 0 0 40 61 44 72 41 35 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]]
上記の結果から分かるように、図1は、二次元テンソル28 * 28の集合であり、各値は0〜255の範囲内です。次のようにここでのデータは、特定のコードが、正規化されます。
#将训练集和测试集的数据除以255,使得像素点分布为0-1
train_images = train_images / 255.0
test_images = test_images / 255.0
今、画像のピクセルは0から1の範囲に収まる、データ形式に対応すると言うことではない、誰もが上記のコードに合わせて自分自身を見ることができます。
建設モデル
ニューラルネットワークの基本的な組成は、層は、入力データとそれに対応する処置から特徴を抽出し、層です。ほとんどのニューラルネットワークは、たとえばkerasのために、簡単な層に一緒に接続されています。
#搭建层的序列,输入数据格式28*28的张量
#添加全连接层,采用激活函数relu
#添加全连接层,激活函数为softmax
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
#编译模型,网络结构搭建好,需要对模型进行编译
#采用adam作为优化器,交叉熵表示损失函数
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#训练模型,将图片与标签进行一一对应,设置10个循环
model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
60000/60000 [==============================] - 2s 28us/sample - loss: 0.4988 - acc: 0.8266
Epoch 2/10
60000/60000 [==============================] - 2s 27us/sample - loss: 0.3777 - acc: 0.8644
Epoch 3/10
60000/60000 [==============================] - 2s 27us/sample - loss: 0.3368 - acc: 0.8773
Epoch 4/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.3135 - acc: 0.8855
Epoch 5/10
60000/60000 [==============================] - 2s 29us/sample - loss: 0.2967 - acc: 0.8907
Epoch 6/10
60000/60000 [==============================] - 2s 27us/sample - loss: 0.2835 - acc: 0.8954
Epoch 7/10
60000/60000 [==============================] - 2s 27us/sample - loss: 0.2711 - acc: 0.8996
Epoch 8/10
60000/60000 [==============================] - 2s 26us/sample - loss: 0.2577 - acc: 0.9040
Epoch 9/10
60000/60000 [==============================] - 2s 26us/sample - loss: 0.2504 - acc: 0.9066
Epoch 10/10
60000/60000 [==============================] - 2s 28us/sample - loss: 0.2411 - acc: 0.9099
評価モデル
トレーニングモデルが完了した後、我々はモデルが正確であるかどうかを判断する必要があり、絵、比較結果を予測することが可能です。
predictions = model.predict(test_images)#对所有标签与图片进行预测
predictions[0]#对第一个图片进行预测
array([1.06123218e-06, 8.76374884e-09, 4.13958730e-07, 9.93547733e-09,
2.39135318e-07, 2.61428091e-03, 2.91701099e-07, 6.94991834e-03,
1.02351805e-07, 9.90433693e-01], dtype=float32)
予測結果は、10桁の配列です。「自信」テンラベルレベルとは対照的に彼らはモデルを表します。あなたは最高の信頼値を持つタグが見ることができる、それは明らかである最初の9桁の数字「自信を持って」(0-9)最高:
np.argmax(predictions[0])
9
#图1对应的标签
test_labels[0]
9
最後に、我々は全体のテストデータセットの状況における鉄道模型ショーを見て
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
10000/1 - 1s - loss: 0.2934 - accuracy: 0.8830
Test accuracy: 0.883
このモデルの精度は88.3パーセントであります