老师参与

请问老师,关于MNIST手写数字识别的网络结构

margaritas 发表于2020年04月06日
<p>关于shape我有点疑惑</p><p>x_train的shape是(60000, 28, 28);</p><p>请问经过Flatten层之后,x_train变成了(60000, 784)还是(784, 60000)</p><p>(60000, 784)表示每一行对应一个数据;(784, 60000)则表示每一列对应一个数据;<br ></p><p><br ></p><p>请问model在训练的时候是传入一个数据进行训练,还是一次性传入batch_size个数据进行训练?</p><p>如果是传入一个数据的话,那输入的shape就是(784, 1)或者是(1, 784)吧?</p><p><br ></p><p>我比较纠结,喂入神经网络的数据的shape,因为如果shape不对的话,那训练的数据不就乱了?</p><p>比如每行表示一个数字的所有像素,结果运算时候是按列进行运算</p><p><br ></p><p>非常期望得到老师解惑,感谢曹老师的tensorflow2课程!</p>
3 回复

    1楼

  • 海纳_百川 发表于2020年04月06日
    1 | 0 | 举报
    <ol class=" list-paddingleft-2" style="list-style-type: decimal;" ><li><p>经过flatten之后变为(60000, 784);<br ></p></li><li><p><img src="https://nos.netease.com/edu-image/da4183e31da6401ab1f4636f0dc28342.png" style="width: 340px; height: 181px;" /></p></li><li><p>说明一下,shape是(60000, 28, 28)的话结果是一样的;<br /></p></li><li><p>每次按照batch_size大小的数量喂入训练,即输入数据的结构是(batch_size, 784),做矩阵相乘的时候<strong>输入变量</strong>在左边,权重矩阵在右边,所以是(N, 784)乘以W,每个数据互补影响。<br /></p></li></ol>
    海纳_百川 发表于2020年04月06日
    添加评论
  • 2楼

  • margaritas 发表于2020年04月06日
    1 | 0 | 举报
    <p>在以上同学的帮助,解决了困惑;把我的理解发一下,如果有问题的话,希望老师指出</p><p><br ></p><p>Flatten层对于输入数据的要求是,第一维必须是batch_size(可以理解为数据的数量)</p><p>输入数据的维度(60000, 28, 28),第一维60000正好表示数量,所以可以经过Flatten层拉直,变成(60000, 784)</p><p>在经过Flatten层之后,model已经知道了第一维表示batch_size,第二维表示输入维度,所以在第一个hidden layer中,不用再设置input_dim为784</p><p>如果以后输入数据变成了(28, 28, 60000),那就要自己进行拉直,传入model,并且设置input_dim=784</p><p><br ></p><p>不知道有没有错的和遗漏的</p>
    margaritas 发表于2020年04月06日
    添加评论
  • 3楼

  • margaritas 发表于2020年04月06日
    2 | 2 | 举报
    <p>还有一点理解</p><p>输入数据表示为矩阵x,hidden layer的参数表示为w,暂且不要b<br ></p><p>hidden layer的运算是x*w还是w*x,取决于input_dim和units</p><p>如果是x = (batch_size, input_dim),那么w = (input_dim, units),运算为x*w</p><p>如果是x = (input_dim, batch_size),那么w = (units, input_dmi),运算为w*x</p><p><br ></p><p>总之,keras的model会根据第一层的input_dim和units自动设置,保证所有运算的shape都正确</p><p>请问老师是这样的吗?</p>
    margaritas 发表于2020年04月06日
    添加评论