博客
关于我
双层卷积神经网络--tf
阅读量:630 次
发布时间:2019-03-14

本文共 3278 字,大约阅读时间需要 10 分钟。

--模拟实现《21个项目玩转深度学习》第一章1.2.2节的代码

--过程中发现自己有以下欠缺

          1、tensor的reshape,不能使用 tensor.reshape(shape=[...]),应该使用 tf.reshape(tensor,shape=[...])

          2、dropout应用full_connect层,用函数 tf.nn.dropout(feature_tensor,keep_prob=...)

          3、经验:softmax_cross_entropy_with_logits内部是不是已经有了对log(0)的异常预防操作?

```python import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./MNIST_data', one_hot=True)
def Weight(shape):    weight = tf.Variable(tf.truncated_normal(shape=shape, stddev=0.1))    return weightdef Bias(shape):    initial = tf.constant(0.1, shape=shape)    bias = tf.Variable(initial_value=initial)    return biasdef Conv2D(tensor, weight):    conv = tf.nn.conv2d(tensor, weight, strides=[1, 1, 1, 1], padding='SAME')    return convdef Maxpool(tensor):    pool = tf.nn.max_pool(tensor, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')    return poolx = tf.placeholder(shape=[None, 784], dtype=tf.float32)y_ = tf.placeholder(shape=[None, 10], dtype=tf.int32)keep_prob = tf.placeholder(tf.float32)x_ = tf.reshape(x, shape=[-1, 28, 28, 1])weight1 = Weight(shape=[5, 5, 1, 32])b1 = Bias(shape=[32])conv1 = tf.nn.relu(Conv2D(x_, weight1) + b1)pool1 = Maxpool(conv1)weight2 = Weight(shape=[5, 5, 32, 64])b2 = Bias(shape=[64])conv2 = tf.nn.relu(Conv2D(pool1, weight2) + b2)pool2 = Maxpool(conv2)w1_fc = Weight(shape=[7 * 7 * 64, 1024])b1_fc = Bias(shape=[1024])pool2_flat = tf.reshape(pool2, shape=[-1, 7 * 7 * 64])fc1 = tf.nn.relu(tf.matmul(pool2_flat, w1_fc) + b1_fc)fc1_dropout = tf.nn.dropout(fc1, keep_prob=keep_prob)w2_fc = Weight(shape=[1024, 10])b2_fc = Bias(shape=[10])fc2 = tf.matmul(fc1_dropout, w2_fc) + b2_fcy = tf.nn.softmax(fc2)y = tf.clip_by_value(y, 1e-8, 1)cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=fc2)loss = cross_entropyoptimizer = tf.train.AdamOptimizer(0.001).minimize(loss)correct_predict = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_, 1), tf.argmax(y, 1)), tf.float32))with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    for i in range(10000):        xs, ys = mnist.train.next_batch(100)        sess.run(optimizer, feed_dict={x: xs, y_: ys, keep_prob: 0.5})        if i % 1000 == 0:            correct_rate = sess.run(correct_predict, feed_dict={x: xs, y_: ys, keep_prob: 1})            print('steps %d, correct_rate = %.4f' % (i, correct_rate))```

          以上代码实现了一个简单的MNIST分类模型,主要包括以下几个部分:

1. 输入处理:使用TensorFlow中的MNIST数据集,读取训练数据并解析成TensorFlow的Tensor对象。

2. 网络结构:从输入层开始,依次包括卷积层(Conv2D)、最大池化层(Maxpool)、全连接层(fc1)、过滤丢弃(Dropout)、第二个全连接层(fc2)和输出层(y)。

3. 必要函数:自定义了权重初始化(Weight)和偏置初始化(Bias)函数,用于构建网络的各个层。

4. 训练过程:使用Adam优化器,定义损失函数(cross_entropy)和训练准确率的计算(correct_predict)。每次训练后输出训练精度。

--经历与改进

1. 关于Tensor reshape函数的改进:在fc1层将pool2展开为平坦张量,使用tf.reshape()函数确保了张量的正确形状,避免了以前直接使用tenforflow的reshape函数可能存在的内存问题。

2. Dropout层的应用:添加了keep_prob参数,控制在全连接层中的神经元活跃度,以防止过拟合。

3. 对于SoftmaxCrossEntropyWithLogits函数的疑问:内部已经实现了对log(0)的预防措施,避免了计算中出现不可处理的结果。

--经验与总结

在实际编写代码时,有以下几点需要注意:

1. 遵循TensorFlow的命名习惯,确保变量名清晰明确,便于后续的查阅和修改。

2. 对layer的结构进行合理分层,方便后续扩展和维护。

3.균형优化:在设计网络架构时,注意卷积层的过滤核大小,以及全连接层的hidden units数量,避免太深或太浅。

4. 训练参数的选择:学习率、批量大小、keep_prob等超参数需要根据实际业务需求进行多次实验调整和优化。

--展望

这个MNIST分类模型是一个入门级的深度学习项目。在后续学习过程中,可以尝试改进网络的深度、使用不同的激活函数、试验不同的优化算法,以提高模型的分类准确率。

转载地址:http://xdylz.baihongyu.com/

你可能感兴趣的文章
【Bootstrap5】精细学习记录
查看>>
Struts2-从值栈获取list集合数据(三种方式)
查看>>
vscode中快速生成vue模板
查看>>
参考图像
查看>>
*.json: [“usingComponents“][“van-button“] 未找到
查看>>
设计模式(18)——中介者模式
查看>>
error LNK2019:无法解析的外部符号_imp_CryptAcquireContextA@20
查看>>
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
查看>>
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED
查看>>
BUU-MISC-caesar
查看>>
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
查看>>
一文理解设计模式--命令模式(Command)
查看>>
VTK:可视化之RandomProbe
查看>>
block多队列分析 - 2. block多队列的初始化
查看>>
Java时间
查看>>
不编译只打包system或者vendor image命令
查看>>
The wxWindows Library Licence (WXwindows)
查看>>
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
查看>>
flink启动(二)
查看>>
pair的用法
查看>>