# 【TensorFlow】TensorFlow 的多层感知器（MLP）

43 篇文章 3 订阅
34 篇文章 5 订阅

## 原理

1. 输入层：有 3072 个输入神经元， m=3072 $m=3072$
2. 隐藏层：有两层（三层）隐藏层，每个隐藏层有 1024 个神经元， p=q=1024 $p=q=1024$
3. 输出层：有10个神经元， n=10 $n=10$

## 代码

from __future__ import print_function
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import cPickle as pickle
# seaborn非必需
import seaborn
# 如果不是在Jupyter Notebook上运行的话请注释掉下面这句
%matplotlib inline

def unpickle(filename):
''' 解压数据 '''
with open(filename) as f:
# for python3
return d

def onehot(labels):
''' one-hot 编码 '''
n_sample = len(labels)
n_class = max(labels) + 1
onehot_labels = np.zeros((n_sample, n_class))
onehot_labels[np.arange(n_sample), labels] = 1

return onehot_labels

# 读取数据
data1 = unpickle('cifar-10-batches-py/data_batch_1')
data2 = unpickle('cifar-10-batches-py/data_batch_2')
data3 = unpickle('cifar-10-batches-py/data_batch_3')
data4 = unpickle('cifar-10-batches-py/data_batch_4')
data5 = unpickle('cifar-10-batches-py/data_batch_5')

X_train = np.concatenate((data1['data'], data2['data'], data3['data'], data4['data'], data5['data']), axis=0)
label = np.concatenate((data1['labels'], data2['labels'], data3['labels'], data4['labels'], data5['labels']), axis=0)
y_train = onehot(label)

test = unpickle('cifar-10-batches-py/test_batch')
X_test = test['data']
y_test = onehot(test['labels'])

# 设置模型参数
learning_rate = 0.001
training_epochs = 500
batch_size = 500
display_step = 1
n_sample = X_train.shape[0]

n_input = X_train.shape[1]
n_hidden_1 = 1024
n_hidden_2 = 1024
n_hidden_3 = 1024
n_class = y_train.shape[1]

x = tf.placeholder('float', [None, n_input])
y = tf.placeholder('float', [None, n_class])

def multiplayer_perceptron(x, weight, bias):

layer1 = tf.nn.relu(layer1)
layer2 = tf.nn.relu(layer2)
layer3 = tf.nn.relu(layer3)

return out_layer

weight = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'h3': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3])),
'out': tf.Variable(tf.random_normal([n_hidden_3, n_class]))
}
bias = {
'h1': tf.Variable(tf.random_normal([n_hidden_1])),
'h2': tf.Variable(tf.random_normal([n_hidden_2])),
'h3': tf.Variable(tf.random_normal([n_hidden_3])),
'out': tf.Variable(tf.random_normal([n_class]))
}

# 建立模型
pred = multiplayer_perceptron(x, weight, bias)

# 定义损失函数
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))

# 优化

# 初始化所有变量
init = tf.initialize_all_variables()

correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))

# 训练模型
with tf.Session() as sess:
sess.run(init)

for epoch in range(training_epochs):
avg_cost = 0
total_batch = int(n_sample / batch_size)

for i in range(total_batch):
_, c = sess.run([optimizer, cost], feed_dict={x: X_train[i*batch_size : (i+1)*batch_size, :],
y: y_train[i*batch_size : (i+1)*batch_size, :]})
avg_cost += c / total_batch

plt.plot(epoch+1, avg_cost, 'co')

if epoch % display_step == 0:
print('Epoch:', '%04d' % (epoch+1), 'cost=', '{:.9f}'.format(avg_cost))

print('Opitimization Finished!')

# Test
acc = accuracy.eval({x: X_test, y: y_test})
print('Accuracy:', acc)

plt.xlabel('Epoch')
plt.ylabel('Cost')
plt.title('lr=%f, te=%d, bs=%d, acc=%f' % (learning_rate, training_epochs, batch_size, acc))
plt.tight_layout()
plt.savefig('cifar-10-batches-py/MLP-TF14-test.png', dpi=200)

plt.show()

## 结果

• lr：learning rate，学习率
• tr：training epochs，训练迭代次数
• bs：batch size，batch大小
• acc：测试准确率

## 一些问题

1. 学习率不能过大，这里使用的 0.001 已经是极限，其他参数不变的情况下，再大例如 0.01，准确率会大幅下跌，跌至 10% 左右，此时无论再怎么增加迭代次数准确率（包括训练准确率）也不会提高，一直在 10% 左右，但是损失却降得很厉害，此处还未彻底搞清楚。
2. 我使用sklearn也测试了一下（代码下载链接和上面一样），最终准确率 46.25%。
3. 本片博文只是为了说明如何使用 TensorFlow 实现MLP，本次做的实验并不一定是最优的实验结果。
4. 这篇博文 同样使用CIFAR10数据集但是使用CNN模型，可以和本文做个对比。

## END

• 3
点赞
• 24
收藏
觉得还不错? 一键收藏
• 打赏
• 3
评论
03-09 2669
02-16 4770
01-06 4473
11-24 1779
11-15 2737
06-15 321
12-21 240
08-27 2639
09-22 426

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

secsilm

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。