鸢尾花数据集。在数据集包含三个特征值及其三个可能的输出类(不同的鸢尾花),因此权值矩阵的维数应为4*3(下载链接)
import tensorflow as tf
#此时,权值构成了一个矩阵,而非向量,每个“特征权值列"对应一个输出类别
W = tf.Variable(tf.zeros([4, 3]), name = "Weights")
#每个偏置也是如此,每个偏置对应一个输出类
b = tf.Variable(tf.zeros([3]), name = "bias")
def inference(X):
return tf.nn.softmax(combine_inputs(X))
def loss(X, Y):
return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=combine_inputs(X), labels=Y))
def read_csv(batch_size, file_name, record_defaults):
filename_queue = tf.train.string_input_producer(["iris.csv"])
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
decoded = tf.decode_csv(value, record_defaults=record_defaults) # 字符串(文本行)转换到指定默认值张量列元组,为每列设置数据类型
return tf.train.shuffle_batch(decoded, batch_size=batch_size, capacity=batch_size * 50,
min_after_dequeue=batch_size) # 读取文件,加载张量batch_size行
def inputs():
sepal_length, sepal_width, petal_length, petal_width, label = read_csv(100, "iris.data", [[0.0],[0.0],[0.0],[0.0],[""]])
label_number = tf.to_int32(tf.argmax(tf.to_int32(tf.stack([
tf.equal(label,["Iris-setosa"]),
tf.equal(label,["Iris-versicolor"]),
tf.equal(label,["Iris-virginica"])
])),0))
features = tf.transpose(tf.stack([ sepal_length, sepal_width, petal_length, petal_width]))
return features, label_number
def combine_inputs(X):
return tf.matmul(X, W) + b
def train(tol_loss):
learning_rate = 0.01
return tf.train.GradientDescentOptimizer(learning_rate).minimize(tol_loss)
def evaluate(sess, X, Y):
predicted = tf.cast(tf.argmax(inference(X), 1), tf.int32)
print sess.run( tf.reduce_mean(tf.cast(tf.equal(predicted, Y), tf.float32)))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
X, Y = inputs()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
tol_loss = loss(X, Y)
train_op = train(tol_loss)
train_step = 1001
for step in range(train_step):
sess.run(train_op)
if step % 100 == 0:
print "%d loss" %step, sess.run(tol_loss)
evaluate(sess, X, Y)
coord.request_stop()
coord.join(threads)