hw7 DeepLearning

+作业三选做作业:
二.选作作业:

连体网络MINIST识别:

构建如下图所示识别模型:该模型由两个相同的网络G(x)组成。两个网络共享相同的参数W.

在这里插入图片描述
该模型实现如下的功能,输入两个MINIST图片,判断是不是同一个数字。

例如,输入 负样本对:X1=6的图片 , X2=9的图片 输出:1

输入 正样本对:X1=3的图片 , X2=3的图片 输出:0

G(x)是一个一般的全连接网络(两边的网络结构是一样的!共享参数W、b等),由结构可以自己设计。比如建议两层网络:hidden1:784(28x28)->500; hidden2: 500->10,使用relu。也可以尝试其他节点数组合,和其他非线性变换函数。

强调:G(X)的功能定义为提取一张minist图像的特征。

该模型的训练采用如下损失函数:

在这里插入图片描述

注意:

使用此loss需要定 y=0 (两个数字相同)y=1 (两个数字不同)!!!!!!!!!!

要求:合理设计网络,及训练数据采样方法,提升网络的正负样本对的预测精度:用ACC衡量。

提交训练、测试代码。及训练、测试截图。

提示:

  1. minist读取可以用tensorflow里写好的工具

from tensorflow.examples.tutorials.mnist import input_data


mnist = input_data.read_data_sets('./data/mnist',one_hot=False)
print(mnist.validation.num_examples)
print(mnist.train.num_examples)
print(mnist.test.num_examples)
  1. 正负样本对的合理采样设计会影响训练效果:

例如如下的方式:

 for itera in range(iter):
        x_1, y_1 = mnist.train.next_batch(batch_size)
        x_2, y_2 = mnist.train.next_batch(batch_size)
        y_s = np.array(y_1!=y_2,dtype=np.float32)

这样只能碰运气碰到几对正样本,但大多数都可能是负样本。两个类型的样本数不平衡。

  1. 损失函数中构建需要都用tf函数,否则无法构建计算图:

常数需要用tf.constant

其他函数例如:E_w = tf.sqrt(tf.reduce_sum(tf.square(o1-o2),1)), tf.exp()等请自查

  1. 两个网络结构是一样的!共享参数。怎样共享参数?考虑我们之前的参数复用练习。

  2. 建议用AdamOptimizer优化器,其他参数建议

lr = 0.01
iter = 20000
batch_size = 64

作业七:

一.基本作业:连体网络MINIST优化

与作业3"深度学习方法与实践课程3: 神经网络作业"选做题任务一致,

即:
输入为两个MNIST图片,以及两者是否为相同数字的标签(0为相同数字,1为不同数字),
输出为网络给出两者是否为同一数字的预测结果。

网络结构可以自己设计。
比如两层网络:hidden1:784(28x28)->500; hidden2: 500->10,使用relu。
也可以尝试Lenet网络或其他结构。

要求:

  1. 构建平衡测试集:
    (1)正例(同一数字对)、反例(不同数字对)样例比为1:1。
    (2)正例中,10个数字类型各占1/10。反例中,不同数字对的所有组合共C^2_10=45种,要求比例也为相同,即反例中,45种组合每个组合比例为1/45。

  2. 测试集正反例总数不少于9000个。(注意,如果要对平衡的测试集有良好的效果,训练的数据集,也应该是平衡的。即我们课上讲的,训练、测试的数据分布要一致。否则,训练的模型是不符合任务需求的。)

  3. 写一个测试集打印脚本,打印出构建好的测试集中类型数量信息,例如下:


Positive (0,0): 450

Positive (1,1): 450

...

Positive (9,9): 450

Pos Total:4500

Negtive (0,1): 100

Negtive (0,2): 100

...

Negtive (8,9): 100

Neg Total:4500

Total: 9000


  1. 训练好网络后(ACC>0.9),根据不同正反例分类阈值绘制P-R曲线并计算AP值。

提交:代码,文档(运行截图,结果截图(包括PR曲线,测试集数量统计打印列表等))

其他问题请参考“讨论区”中关于作业三选作题的提问及解答。

提示

训练过程中,关于数据平衡的一个方案可以参考:

def minist_draw(im):
    im = im.reshape(28, 28)
    fig = plt.figure()
    plotwindow = fig.add_subplot(111)
    plt.axis('off')
    plt.imshow(im, cmap='gray')
    plt.show()
    # plt.savefig("test.png")  
    plt.close()
 
def balanced_batch(batch_x,batch_y, num_cls):
    batch_size=len(batch_y)
    pos_per_cls_e=round(batch_size/2/num_cls/2)
	pos_per_cls_e*=2
 
    index=batch_y.argsort()
    ys_1=batch_y[index]
    #print(ys_1)
    
    num_class=[]
    pos_samples=[]
    neg_samples=set()
    cur_ind=0
    for item in set(ys_1):
        num_class.append((ys_1==item).sum())
        num_pos=pos_per_cls_e
        while(num_pos>num_class[-1]):
            num_pos-=2
        pos_samples.extend(np.random.choice(index[cur_ind:cur_ind+num_class[-1]],num_pos,replace=False).tolist())
        neg_samples=neg_samples|(set(index[cur_ind:cur_ind+num_class[-1]])-set(list(pos_samples)))
        cur_ind+=num_class[-1]
    
    neg_samples=list(neg_samples)
    
    x1_index=pos_samples[::2]
    x2_index=pos_samples[1:len(pos_samples)+1:2]
 
    x1_index.extend(neg_samples[::2])
    x2_index.extend(neg_samples[1:len(neg_samples)+1:2])
    
    p_index=np.random.permutation(len(x1_index))
    x1_index=np.array(x1_index)[p_index]
    x2_index=np.array(x2_index)[p_index]
 
    r_x1_batch=batch_x[x1_index]
    r_x2_batch=batch_x[x2_index]
    r_y_batch=np.array(batch_y[x1_index]!=batch_y[x2_index],dtype=np.float32)
    return r_x1_batch,r_x2_batch,r_y_batch
用我那个平衡的示例的要注意,我那个平衡中的关于y的定义是:

y = tf.placeholder(tf.float32, shape=[batch_size])

而大家如果是[none,1]的定义的可能要适当修改。

另外注意是否你的0,1定义和我的一致,(我记不得我这个平衡的函数里面是不是改过来了。。。)

还有就是batch_size最好是偶数的


P-R曲线绘制,以及AP求解:可以用sklearn中提供的方法:metrics.precision_recall_curve

precision, recall, _thresholds = metrics.precision_recall_curve(label, prob)
	#输入: 
 
 
	#label测试样本真实标签,shape=[num_samples]
 
 
	#prob测试样本预测得分, shape=[num_samples]
 
area = metrics.auc(recall, precision)


batch_x MNIST样本 batch_y, MNIST标签 num_cls (数字类型个数,10,为了让10个数字类型都充分采样正负样本对)

返回:return r_x1_batch, r_x2_batch,r_y_batch 输入样本对( r_x1_batch, r_x2_batch)样本对正负例标签 r_y_batch

参考reference::
https://www.educoder.net/boards/7896/topics/41463

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值