本文共 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)的异常预防操作?
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/