代码段:存放程序机器码和只读数据
数据段:存放程序中的静态数据
堆栈段:存放程序中的动态数据
堆段需要malloc手动申请,free手动释放
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)
当调用一个函数时,将创建一个栈桢来支持该函数的执行。栈桢包含函数的局部变量和调用者传递给函数的参数
堆栈的内存地址越来越低,即向地址小的地方增长
1.参数逆序压栈
2.返回地址压栈
import collections
import numpy as np
import tensorflow as tf
import tensorflow_federated as tff
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# matplotlib画图中中文显示会有问题,需要这两行设置默认字体
emnist_train,emnist_test=tff.simulation.datasets.emnist.load_data()
example_dataset=emnist_train.create_tf_dataset_for_client(emnist_train.client_ids[0])
example_element=next(iter(example_dataset))
example_element['label'].numpy()
#设置图的宽,高
# fig=plt.figure(figsize=(12,7))
# fig.suptitle('我')
# for i in range(6):
# client_dataset=emnist_train.create_tf_dataset_for_client(emnist_train.client_ids[i])
# #为字典设默认值
# plot_data=collections.defaultdict(list)
# for example in client_dataset:
# label=example['label'].numpy()
# plot_data[label].append(label)
# plt.subplot(2,3,i+1)
# plt.title('客户 {}'.format(i))
# for j in range(10):
# plt.hist(plot_data[j],density=False,bins=[0,1,2,3,4,5,6,7,8,9,10])
# plt.show()
NUM_CLIENTS =10
#向前和向后传播中所有批次的单次训练迭代 one epoch = numbers of iterations = N = 训练样本的数量/batch_size
NUM_EPOCHS=5
#小批的梯度下降,把数据分为20批,按批来更新参数
BATCH_SIZE=20
SHUFFLE_BUFFER=100
PREFETCH_BUFFER=10
def preprocess(dataset):
def batch_format_fn(element):
#将图像像素展开,返回OrderedDict对象的特征
return collections.OrderedDict(x=tf.reshape(element['pixels'],[-1,784]),
y=tf.reshape(element['label'],[-1,1]))
return dataset.repeat(NUM_EPOCHS).shuffle(SHUFFLE_BUFFER).batch(
BATCH_SIZE).map(batch_format_fn).prefetch(PREFETCH_BUFFER