input_data.py直接先将图片路径和标签对应为两个列表,然后用Tensorflow的模块生产批次batch
-
import os
-
import tensorflow
as tf
-
import matplotlib.pyplot
as plt
-
import numpy
as np
-
-
train_path =
‘D:/python学习/神经网络动物分类/train/’
-
test_path =
‘D:/python学习/神经网络动物分类/test/’
-
-
classes = [
“airplane”,
“automobile”,
“bird”,
“cat”,
“deer”,
-
“dog”,
“frog”,
“horse”,
“ship”,
“truck”]
-
-
-
def get_files(file_dir):
-
# file_dir: 文件夹路径
-
# return: 乱序后的图片和标签
-
img_list = []
-
label_list = []
-
for index, name
in enumerate(classes):
-
class_path = file_dir + name +
“/”
-
for img_name
in os.listdir(class_path):
-
img_path = class_path + img_name
-
img_list.append(img_path)
-
label_list.append(int(index))
-
-
temp = np.array([img_list, label_list])
-
temp = temp.transpose()
# 转置
-
np.random.shuffle(temp)
-
img_list = list(temp[:,
0])
-
label_list = list(temp[:,
1])
-
label_list = [int(i)
for i
in label_list]
-
-
return img_list, label_list
-
-
-
def get_batch(image, label, image_W, image_H, batch_size, capacity):
-
# image, label: 要生成batch的图像的地址和标签list
-
# image_W, image_H: 图片的宽高
-
# batch_size: 每个batch有多少张图片
-
# capacity: 队列容量
-
# return: 图像和标签的batch
-
-
# 将python.list类型转换成tf能够识别的格式
-
image = tf.cast(image, tf.string)
-
label = tf.cast(label, tf.int32)
-
-
# 生成队列
-
input_queue = tf.train.slice_input_producer([image, label])
-
-
image_contents = tf.read_file(input_queue[
0])
-
label = input_queue[
1]
-
image = tf.image.decode_jpeg(image_contents, channels=
3)
-
-
image = tf.image.resize_images(image, [image_H, image_W], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
-
image = tf.cast(image, tf.float32)
-
-
image_batch, label_batch = tf.train.batch([image, label],
-
batch_size=batch_size,
-
num_threads=
64,
# 线程
-
capacity=capacity)
-
return image_batch, label_batch
-
-
# 测试两个函数是否成功运行
-
”“”
-
if __name__ == ‘__main__’:
-
BATCH_SIZE = 2
-
CAPACITY = 256
-
IMG_W = 32
-
IMG_H = 32
-
image_list, label_list = get_files(train_path)
-
image_batch, label_batch = get_batch(image_list, label_list, IMG_W, IMG_H, BATCH_SIZE, CAPACITY)
-
with tf.Session() as sess:
-
i = 0
-
coord = tf.train.Coordinator()
-
threads = tf.train.start_queue_runners(coord=coord)
-
try:
-
while not coord.should_stop() and i < 1:
-
img, label = sess.run([image_batch, label_batch])
-
-
for j in np.arange(BATCH_SIZE):
-
print(“label: %d” % label[j])
-
plt.imshow(img[j, :, :, :])
-
plt.show()
-
i += 1
-
except tf.errors.OutOfRangeError:
-
print(“done!”)
-
finally:
-
coord.request_stop()
-
coord.join(threads)
-
“”“
model.py函数实现了模型以及预测
-
#coding=utf-8
-
import tensorflow
as tf
-
-
def inference(images, batch_size, n_classes):
-
-
with tf.variable_scope(
'conv1')
as scope:
-
# 卷积盒的为 3*3 的卷积盒,图片厚度是3,输出是16个featuremap
-
weights = tf.get_variable(
'weights',
-
shape=[
3,
3,
3,
16],
-
dtype=tf.float32,
-
initializer=tf.truncated_normal_initializer(stddev=
0.1, dtype=tf.float32))
-
biases = tf.get_variable(
'biases',
-
shape=[
16],
-
dtype=tf.float32,
-
initializer=tf.constant_initializer(
0.1))
-
conv = tf.nn.conv2d(images, weights, strides=[
1,
1,
1,
1], padding=
'SAME')
-
pre_activation = tf.nn.bias_add(conv, biases)
-
conv1 = tf.nn.relu(pre_activation, name=scope.name)
-
-
with tf.variable_scope(
'pooling1_lrn')
as scope:
-
pool1 = tf.nn.max_pool(conv1, ksize=[
1,
3,
3,
1], strides=[
1,
2,
2,
1], padding=
'SAME', name=
'pooling1')
-
norm1 = tf.nn.lrn(pool1, depth_radius=
4, bias=
1.0, alpha=
0.001 /
9.0, beta=
0.75, name=
'norm1')
-
-
with tf.variable_scope(
'conv2')
as scope:
-
weights = tf.get_variable(
'weights',
-
shape=[
3,
3,
16,
16],
-
dtype=tf.float32,
-
initializer=tf.truncated_normal_initializer(stddev=
0.1, dtype=tf.float32))
-
biases = tf.get_variable(
'biases',
-
shape=[
16],
-
dtype=tf.float32,
-
initializer=tf.constant_initializer(
0.1))
-
conv = tf.nn.conv2d(norm1, weights, strides=[
1,
1,
1,
1], padding=
'SAME')
-
pre_activation = tf.nn.bias_add(conv, biases)
-
conv2 = tf.nn.relu(pre_activation, name=
'conv2')
-
-
# pool2 and norm2
-
with tf.variable_scope(
'pooling2_lrn')
as scope:
-
norm2 = tf.nn.lrn(conv2, depth_radius=
4, bias=
1.0, alpha=
0.001 /
9.0, beta=
0.75, name=
'norm2')
-
pool2 = tf.nn.max_pool(norm2, ksize=[
1,
3,
3,
1], strides=[
1,
1,
1,
1], padding=
'SAME', name=
'pooling2')
-
-
with tf.variable_scope(
'local3')
as scope:
-
reshape = tf.reshape(pool2, shape=[batch_size,
-1])
-
dim = reshape.get_shape()[
1].value
-
weights = tf.get_variable(
'weights',
-
shape=[dim,
128],
-
dtype=tf.float32,
-
initializer=tf.truncated_normal_initializer(stddev=
0.005, dtype=tf.float32))
-
biases = tf.get_variable(
'biases',
-
shape=[
128],
-
dtype=tf.float32,
-
initializer=tf.constant_initializer(
0.1))
-
local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name)
-
-
# local4
-
with tf.variable_scope(
'local4')
as scope:
-
weights = tf.get_variable(
'weights',
-
shape=[
128,
128],
-
dtype=tf.float32,
-
initializer=tf.truncated_normal_initializer(stddev=
0.005, dtype=tf.float32))
-
biases = tf.get_variable(
'biases',
-
shape=[
128],
-
dtype=tf.float32,
-
initializer=tf.constant_initializer(
0.1))
-
local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name=
'local4')
-
-
# softmax
-
with tf.variable_scope(
'softmax_linear')
as scope:
-
weights = tf.get_variable(
'softmax_linear',
-
shape=[
128, n_classes],
-
dtype=tf.float32,
-
initializer=tf.truncated_normal_initializer(stddev=
0.005, dtype=tf.float32))
-
biases = tf.get_variable(
'biases',
-
shape=[n_classes],
-
dtype=tf.float32,
-
initializer=tf.constant_initializer(
0.1))
-
softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=
'softmax_linear')
-
-
return softmax_linear
-
-
-
-
def losses(logits, labels):
-
with tf.variable_scope(
'loss')
as scope:
-
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits \
-
(logits=logits, labels=labels, name=
'xentropy_per_example')
-
loss = tf.reduce_mean(cross_entropy, name=
'loss')
-
tf.summary.scalar(scope.name +
'/loss', loss)
-
return loss
-
-
def trainning(loss, learning_rate):
-
with tf.name_scope(
'optimizer'):
-
optimizer = tf.train.AdamOptimizer(learning_rate= learning_rate)
-
global_step = tf.Variable(
0, name=
'global_step', trainable=
False)
-
train_op = optimizer.minimize(loss, global_step= global_step)
-
return train_op
-
-
def evaluation(logits, labels):
-
with tf.variable_scope(
'accuracy')
as scope:
-
correct = tf.nn.in_top_k(logits, labels,
1)
-
correct = tf.cast(correct, tf.float16)
-
accuracy = tf.reduce_mean(correct)
-
tf.summary.scalar(scope.name +
'/accuracy', accuracy)
-
return accuracy
train.py函数实现了训练过程
-
import os
-
import numpy
as np
-
import tensorflow
as tf
-
import input_data
-
import model
-
-
N_CLASSES =
10
-
IMG_H =
32
-
IMG_W =
32
-
BATCH_SIZE =
200
-
CAPACITY =
2000
-
MAX_STEP =
15000
-
learning_rate =
0.0001
-
-
def run_training():
-
-
train_dir =
"D:\\python学习\\神经网络动物分类\\train\\"
-
logs_train_dir =
"logs\\"
-
train, train_label = input_data.get_files(train_dir)
-
train_batch, train_label_batch = input_data.get_batch(train,
-
train_label,
-
IMG_W,
-
IMG_H,
-
BATCH_SIZE,
-
CAPACITY)
-
train_logits = model.inference(train_batch, BATCH_SIZE, N_CLASSES)
-
train_loss = model.losses(train_logits, train_label_batch)
-
train_op = model.trainning(train_loss, learning_rate)
-
train_acc = model.evaluation(train_logits, train_label_batch)
-
-
summary_op = tf.summary.merge_all()
-
sess = tf.Session()
-
train_writer = tf.summary.FileWriter(logs_train_dir, sess.graph)
-
saver = tf.train.Saver()
-
-
sess.run(tf.global_variables_initializer())
-
coord = tf.train.Coordinator()
-
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
-
-
try:
-
for step
in np.arange(MAX_STEP):
-
if coord.should_stop():
-
break
-
_, tra_loss, tra_acc = sess.run([train_op, train_loss, train_acc])
-
-
if step %
100 ==
0:
-
print(
"Step %d, train loss = %.2f, train accuracy = %.2f%%" % (step, tra_loss, tra_acc))
-
summary_str = sess.run(summary_op)
-
train_writer.add_summary(summary_str, step)
-
if step %
2000 ==
0
or (step +
1) == MAX_STEP:
-
checkpoint_path = os.path.join(logs_train_dir,
"model.ckpt")
-
saver.save(sess, checkpoint_path, global_step=step)
-
except tf.errors.OutOfRangeError:
-
print(
"Done training -- epoch limit reached.")
-
finally:
-
coord.request_stop()
-
-
coord.join(threads)
-
sess.close()
-
-
if __name__ ==
'__main__':
-
run_training()
</div>