• EthanLifeGreat
    2019-02-25
    # 绘制错误的手写体数字,其中A为正确标签
    fig = plt.figure()
    for i in range(15):
        plt.subplot(3,5,i+1) # 绘制前 15 个手写体,以 3 行 5 列子图形式展示
        plt.tight_layout() # 自适应子图尺寸
        plt.imshow(x_test[incorrect_indices[i]], cmap='Greys')
        plt.title("{} A:{}".format(predicted_classes[incorrect_indices[i]],y_test[incorrect_indices[i]])) # 设置对应标签为子图标题
        plt.xticks([]) # 删除 x 轴标记
        plt.yticks([]) # 删除 y 轴标记
     
    展开
    
     3
  • Geek_f57db5
    2019-04-04
    彭老师,您在解释训练过程中第一轮val_acc比acc高的时候出现了一处问题:通过对比数据可以发现,横坐标0实际上对应着第1轮训练完成后的结果(因为横坐标的范围是0到4,同时纵坐标的值也可以佐证),所以横坐标为0时,val_acc和acc不都应该是第一轮训练结果之后的值吗。同时,有个问题想要请教:为什么训练数据也会有准确率(acc)?这个准确率(acc)是怎么算出来的?

    作者回复: 对呀,横坐标为0时就是第1个epoch训练完的结果。
    因为训练数据也有标签呀。

    
    
  • 索菲
    2019-04-01
    彭老师,我好像找到原因了,模型参数的问题,我应该是开始训练的时候,模型参数没有清除。我把输出都清除之后,从头开始训练就差不多。

    作者回复: 👍👍

    
    
  • 1
    2019-03-25
    我的训练的时候的耗时和loss的值以及准确率怎么跑出来的结果和您的不一样呢
    Train on 60000 samples, validate on 10000 samples
    Epoch 1/5
     - 10s - loss: 0.1820 - acc: 0.9474 - val_loss: 1.1927 - val_acc: 0.9260
    Epoch 2/5
     - 9s - loss: 0.1601 - acc: 0.9524 - val_loss: 0.9594 - val_acc: 0.9404
    Epoch 3/5
     - 9s - loss: 0.1408 - acc: 0.9582 - val_loss: 0.9494 - val_acc: 0.9411
    Epoch 4/5
     - 10s - loss: 0.1234 - acc: 0.9637 - val_loss: 0.9348 - val_acc: 0.9420
    Epoch 5/5
     - 10s - loss: 0.1086 - acc: 0.9678 - val_loss: 0.9655 - val_acc: 0.9401
    展开

    作者回复: 因为在训练时,我们梯度下降的情况或许会有不同,所以不会输出完全一样的 loss 和 acc 哈。但是最终收敛的结果差距很小。

    
    
  • 白鹤之盾
    2019-03-10
    correct_indices = np.nonzero(predicted_classes == y_test)[0] 这为什么要加一个[0]?javascript:;

    作者回复: 因为右边的结果是 (numpy.array)的形式,[0] 就可以取出 tuple 中的 numpy.array.

    
    
  • 王健
    2019-03-03
    老师, 这个例子里面, 用的keras , 这个算是tensorflow吗, 为啥不用ts呢, 不是keras能做的ts不都能做吗 , 不是面向ts实战吗

    作者回复: 因为大部分学员建议用高层次 API。入门的话,Keras 更好上手,也是大部分AI用户的选择。TF 低层次 API 讲起来比较复杂,并且最近大量都 depreacated。等 2.0 出来了,可以基于 TensorFlow Eager 跟大家讲讲动态图

    
    
  • calmer
    2019-03-01
    没讲为什么2个隐藏层,每个隐藏层的神经元是512个,为什么用relu激活函数

    作者回复: 2个隐藏层是考虑到识别任务的难度和数据量多少。
    512是经验数值,也可以用 256或者128。大家在很多论文中看到对于这类超参数的选择,通常都是基于某个数据集上,根据性能表现最终选择了某个值。
    相比 sigmoid 和 tanh,使用relu 激活函数计算速度更快,也是大家现在常用的激活函数。

    
    
我们在线,来聊聊吧