TensorFlow-cifarトレーニングとテスト(自分のデータを分類してテストできる)

3100 ワード

第一部分:ソフト・ハードウェアのテスト
ハードウェア:NVIDIA-GTX 1080
ソフトウェア:Windows 7、python 3.6.5、tensorflow-gpu-1.4.0
第2部:データダウンロード
データセットのダウンロードリンク
第3部:コードステップ展示
ステップ1:tensorflowのインポート
import os
from PIL import Image
import numpy as np
import tensorflow as tf

ステップ2:モデル関数の定義
def model_load(x_, y_, keep_prob):
    conv1 = tf.layers.conv2d(x_, 20, 5, activation=tf.nn.relu)
    pool1 = tf.layers.max_pooling2d(conv1, [2, 2], [2, 2])
    conv2 = tf.layers.conv2d(pool1, 40, 4, activation=tf.nn.relu)
    pool2 = tf.layers.max_pooling2d(conv2, [2, 2], [2, 2])
    pool2_reshape = tf.layers.flatten(pool2)
    fc = tf.layers.dense(pool2_reshape, 400, activation=tf.nn.relu)
    fc_dropout = tf.layers.dropout(fc, keep_prob)
    y_out = tf.layers.dense(fc_dropout, 3)
    return y_out

ステップ3:データ読み出し関数の定義
def read_data(data_dir):
    datas = []
    labels = []
    fpaths = []
    for fname in os.listdir(data_dir):
        fpath = os.path.join(data_dir, fname)
        fpaths.append(fpath)
        image = Image.open(fpath)
        data = np.array(image) / 255.0
        label = int(fname.split("_")[0])
        datas.append(data)
        labels.append(label)

    datas = np.array(datas)
    labels = np.array(labels)
    return fpaths, datas, labels

ステップ4:ネットワーク入出力の定義
#define x y size
x_ = tf.placeholder(tf.float32, [None, 32, 32, 3])
y_ = tf.placeholder(tf.int32, [None])
keep_prob = tf.placeholder(tf.float32)

#load model
y_out = model_load(x_, y_, keep_prob)

#define loss
losses = tf.nn.softmax_cross_entropy_with_logits(labels = tf.one_hot(y_, 3), logits = y_out)
mean_loss = tf.reduce_mean(losses)
optimizer = tf.train.AdamOptimizer(learning_rate=1e-2).minimize(mean_loss)

#define predict top1
predicted_labels = tf.argmax(y_out, 1)

ステップ5:cifarデータセットの読み出し
#read data
data_dir = "data"
model_path = "model/cifar_model"
fpaths, datas, labels = read_data(data_dir)

ステップ6:トレーニングとテスト(100%精度)
#define saver and sess
saver = tf.train.Saver()
sess = tf.Session()

#train or test
train = True
if train:
    sess.run(tf.global_variables_initializer())
    for step in range(150):
        _, mean_loss_val = sess.run([optimizer, mean_loss], feed_dict={x_:datas, y_:labels, keep_prob:0.25})
        if step % 10 == 0:
            print("step = {}\tmean loss = {}".format(step, mean_loss_val))
    saver.save(sess, model_path + str(150))
else:
    labels_name = ["plane", "car", "bird"]
    saver.restore(sess, model_path)
    predicted_labels_val = sess.run(predicted_labels, feed_dict={x_:datas, y_:labels, keep_prob:0})
    img_count = 0
    for fpath in fpaths:
        print("{}\t{} =? {}".format(fpath, labels_name[labels[img_count]], labels_name[predicted_labels_val[img_count]]))
        img_count += 1

ステップ7:コメント
lossが低下しないことが判明した場合,パラメータ初期化の問題が原因で訓練がフィッティングされたことを示した.これは大丈夫です.モデルを削除して、もう一度訓練すればいいです.
 
任意の問題は、QQ 258205918(名前samylee)を追加してください.