1.虽然神经元模型简单,但是花在数据处理和训练模型上的时间也不少。在多分类时重用这部分代码,只要修改模型即可。
2.修改模型(多个神经元(10个)多分类实现逻辑斯蒂回归):(单层神经网络:10个神经元)
(做修改的地方)
for filename in filenames:
data, labels = load_data(filename)
# 不需要在做filter
all_data.append(data)
all_labels.append(labels)
# [None], y:label,[0,5,6,3,...]
y = tf.placeholder(tf.int64, [None])
# (3072, 10)
w = tf.get_variable('w', [x.get_shape()[-1], 10], # 多分类
initializer=tf.random_normal_initializer(0, 1)) #initializer表示初始化,这里使用正态分布,均值为0,方差为1
# (10, )
b = tf.get_variable('b', [10],
initializer=tf.constant_initializer(0.0)) # b使用常量初始化
# get_variable表示获取变量,如果已经定义好了就使用,如果没有就定义
# [None, 3072] * [3072, 10] = [None, 10]
y_ = tf.matmul(x, w) + b
# mean square loss
'''
# 因为是多分类,使用softmax
# course:1+e^x
# api:e^x/sum(e^x)
# 归一化
# p_y:每个样本都是一个分布,10个值加起来等于1,[[0.01,0.9,...0.03], []...]
p_y = tf.nn.softmax(y_)
# 多分类的loss,可以使用one-hot编码把y也变成一个分布
# 5 -> [0,0,0,0,0,1,0,0,0,0]
y_one_hot = tf.one_hot(y, 10, dtype=tf.float32)
loss = tf.reduce_mean(tf.square(y_one_hot - p_y)) # 类型不一致需要变换
'''
loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
# y_ -> softmax
# y -> one_hot
# loss = ylogy_
# 得到的是index,是一个int值
predict = tf.argmax(y_, 1)
# [1, 0, 1, 1, 0, 1,...]
correct_prediction = tf.equal(predict, y) # bool
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))
3.API不会的时候要学会查文档。
4.jupyter notebook的一些用法:
章节主要内容