**前言:**今天的学习内容主要是学会用Tensorflow编写神经网络,加强Tensorflow用法的学习,下午进行查阅和了解深度学习在医学图像方面的研究成果和前景等。
一.Tensorflow教程(续)
1.损失函数
在回归或分类模型中,定义损失函数的目的是找到使损失最小化的系数。声明一个损失函数,需要将系数定义为变量,将数据集定义为占位符,可以有一个常学习率或变化的学习率。
(1).标准线性回归 (2).多元线性回归
其中 m 是样本数量,n 是特征数量。
(3).逻辑回归
在逻辑回归的情况下,损失函数定义为交叉熵。输出 Y 的维数等于训练数据集中类别的数量,其中 P 为类别数量:
2.优化器的使用
(1).梯度下降优化器
其中, learning_rate 参数可以是一个常数或张量,介于 0 和 1 之间。
优化的定义:
(2).Adam 优化器
该方法利用梯度的一阶和二阶矩对不同的系数计算不同的自适应学习率。
(3).其他优化器
3.激活函数
激活函数为神经元提供了模拟复杂非线性数据集所必需的非线性特性,该函数取所有输入的加权和,进而生成一个输出信号。我们可以把它看做一个输入与输出之间的转换,使用激活函数,可以把输出值限定在一个定义的范围之内。
如果 xi 是第 j 个输入,Wj 是连接第 j 个输入到神经元的权重,b 是神经元的偏置,神经元的输出(在生物学术语中,神经元的激活)由激活函数决定,并且在数学上表示如下: 这里,g 表示激活函数。激活函数的参数 ΣWjxj+b 被称为神经元的活动。
(1).Sigmoid 激活函数
在这种情况下,神经元的输出由函数 g(x)=1/(1+exp(-x)) 确定。在 TensorFlow 中,方法是 tf.sigmoid,它提供了 Sigmoid 激活函数。这个函数的范围在 0 到 1 之间: (2).整流线性单元(ReLU)激活函数
这个激活函数类似于线性激活函数,但有一个大的改变:对于负的输入值,神经元不会激活(输出为零),对于正的输入值,神经元的输出与输入值相同:
(3).Softmax 激活函数
Softmax 激活函数是一个归一化的指数函数。一个神经元的输出不仅取决于其自身的输入值,还取决于该层中存在的所有其他神经元的输入的总和。这样做的一个优点是使得神经元的输出小,因此梯度不会过大。
4.基于Tensorflow的神经网络
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('data', one_hot=True)
n_hidden_1 = 256
n_hidden_2 = 128
n_input = 784
n_classes = 10
x = tf.placeholder('float', [None, n_input])
y = tf.placehplder('float', [None, n_classes])
stddev = 0.1
weights = {
'w1': tf.Variable(tf.random_normal([n_input, n_hidden_1], stddev=stddev))
'w2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], stddev=stddev))
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes], stddev=stddev))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1]))
'b2': tf.Variable(tf.random_normal([n_hidden_2]))
'out':tf.Variable(tf.random_normal([n_classes]))
}
print('network ready !')
def multilayer_perception(_X, _weights,_biases):
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['w1']),_biases['b1']))
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['w2']),_biases['b2']))
return (tf.matmul(layer_2, _weights['out']) + _biases['out'])
pred = multilayer_perception(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optm = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost)
corr = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accr = tf.reduce_mean(tf.cast(corr, "float"))
init = tf.global_variables_initializer()
print('loss function !')
traininng_epochs = 20
batch_size = 100
display_step = 4
with tf.Session() as sess:
sess.run(init)
for epoch in range(training_epochs):
avg_cost = 0
total_batch = int(mnist.train.num_examples/batch_size)
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
feeds = (x:batch_xs, y: batch_ys)
sess.run(optm, feed_dict=feeds)
avg_cost +=sess.run(cost, feed_dict=feeds)
avg_cost +=avg_cost / total_batch
if (epoch+1) % display_step == 0:
print('Epoch: %03d/%03d cost: %0.9f' %(epoch, training_epochs, avg_cost))
feeds = {x:batch_xs, y:batch_ys}
train_acc = sess.run(accr, feed_dict=feeds)
print('train acc: %.3f' % (train_acc))
feeds = {x:mnist.test.images, y:mnist.test.labels}
test_acc = sess.run(accr, feed_dict=feeds)
print('test acc: %.3f' % (test_acc))
print('opt finished !')
最终的结果是随着迭代次数的增加,loss值会逐渐减小,测试的准确率会越来越高。
二.总结
今天主要是学习基于Tensorflow的神经网络的编写,通过亲自动手编写第一个神经网络,使我对Tensorflow框架有了更深刻的认识和理解。明天早晨的任务是用Tensorflow完成卷积神经网络的编写,下午上课,晚上将进行学习内容的总结。