1.如何执行计算图:
# 执行计算图,首先要初始化变量
init = tf.global_variable_initializer()
# 对于tensorflow来说,在构建好计算图后,需要开启一个会话session
# 打开会话之后,就可以执行计算图了
with tf.Session() as sess:
# 在会话中执行计算图使用sess.run()方法,如果加了train_op,就说明在这次run中我们就去训练了,如果没有,就是在测试模式下
# feed_dict:要喂入的数据,因为前面x和y都是placeholder,所以需要输入数据,x和y应该输入的是CIFAR-10的数据,分别是图片数据和label数据
# 需要在CIFAR-10数据集上循环遍历整个数据,使得feed_dict拿到的是不同的数据
# 为了达到这种处理模式,我们需要对CIFAR-10的数据集做一些处理
sess.run([loss, accuracy, train_op], feed_dict={x: })
# CIFAR-10数据处理的方法
class CifarData:
# 初始化:filenames,文件名说明对于训练数据集和测试数据集是分开的
# need_shuffle:对于训练集来说,在训练的时候,过完一遍数据之后,需要shuffle一下数据,就是使得数据更加散乱,散乱代表数据之间没有依赖关系,使得泛化能力更强,这是机器学习中一个常用的概念
# 对于测试集来说,因为不需要训练,所以不需要shuffle
def __init__(self, filenames, need_shuffle):
# 把数据读进来
all_data = []
all_labels = []
for filename in filenames:
data, labels = load_data(filename)
# 因为我们要做的是一个二分类的问题,所以我们只用CIFAR-10的0和1两个分类,在这里需要做一个filter
# 因为data和labels的数目是一样的,所以我们把它们打包到一起
for item, label in zip(data, labels):
# 如果类别是0,1的话,就把数据和label放进来
if label in [0, 1]:
all_data.append(item)
all_labels.append(label)
# 把最后的值合并并且转化为numpy的矩阵
self._data = np.vstack(all_data) # 从纵向上把数据合并到一起,因为all_data定义是一个一个向量
self._labels = np.hstack(all_labels) # 从横向上合并到一起,因为label实际上是一个一维向量
# 测试
print(self._data.shape)
print(self._labels.shape)
self._num_examples = self._data.shape[0] # 数量
self._need_shuffle = need_shuffle # shuffle开关
self._indicator = 0 # 表示训练集已经遍历到哪个位置了
if self._need_shuffle:
self._shuffle_data()
# 因为all_data和all_labels都是numpy的数据结构,所以我们可以用numpy的方法来做
def _shuffle_data(self):
# np.random.permutation这个函数会做一个混排,从0到_num_examples,如[0, 1, 2, 3, 4, 5] -> [5, 3, 2, 4, 0, 1]
p = np.random.permutation(self._num_examples)
# p只是得到一个排列,需要把数据放进来
# _data和_labels应该做一样的shuffle,否则会错乱
self._data = self._data[p]
self._labels = self._labels[p]
def next_batch(self, batch_size):
'''return batch_size examples as a batch.'''
end_indicator = self._indicator + batch_size # 对应于_indicator,这个表示结束位置
if end_indicator > self._num_examples:
if self._need_shuffle:
self._shuffle_data()
self._indicator = 0
end_indicator = batch_size
else:
raise Exception('have no more examples')
# 当end_indicator=batch_size时,如果还比_num_examples大,就需要抛出异常了
if end_indicator > self._num_examples:
raise Exception('batch size is larger than all examples')
batch_data = self._data[self._indicator: end_indicator] # 需要把这个范围内的数据放到结果中
batch_labels = self._labels[self._indicator: end_indicator]
self._indicator = end_indicator
return batch_data, batch_labels
train_filenames = [os.path.join(CIFAR_DIR, 'data_batch_%d' % i) for i in range(1,6)]
test_filenames = [os.path.join(CIFAR_DIR, 'test_batch')]
train_data = CifarData(train_filenames, True)
train_steps = 100000
未优化结果:)
