Skip to main content
 首页 » 编程设计

python之tensorflow如何做CNN计算

2025年01月19日31pander-it

学习CNN的时候,觉得blog很blow

他用C语言做cnn,引用Matlab DeepLearnToolbox cnn。 代码如吹

//---forward Propagation,InputData is image data 
void cnnff(CNN* cnn,float** inputData) 
{ 
    int outSizeW=cnn->S2->inputWidth; 
    int outSizeH=cnn->S2->inputHeight; 
    int i,j,r,c; 
 
    //---the first,convolution C1 
    nSize mapSize={cnn->C1->mapSize,cnn->C1->mapSize}; 
    nSize inSize={cnn->C1->inputWidth,cnn->C1->inputHeight}; 
    nSize outSize={cnn->S2->inputWidth,cnn->S2->inputHeight}; 
    for(i=0;i<(cnn->C1->outChannels);i++){ 
        for(j=0;j<(cnn->C1->inChannels);j++){ 
            float** mapout=cov(cnn->C1->mapData[j][i],mapSize,inputData,inSize,valid); 
            addmat(cnn->C1->v[i],cnn->C1->v[i],outSize,mapout,outSize); 
            for(r=0;r<outSize.r;r++) 
                free(mapout[r]); 
            free(mapout); 
        } 
        for(r=0;r<outSize.r;r++) 
            for(c=0;c<outSize.c;c++) 
                cnn->C1->y[i][r][c]=activation_Sigma(cnn->C1->v[i][r][c],cnn->C1->basicData[i]); 
    } 
 
    //the second,pooling S2 
    outSize.c=cnn->C3->inputWidth; 
    outSize.r=cnn->C3->inputHeight; 
    inSize.c=cnn->S2->inputWidth; 
    inSize.r=cnn->S2->inputHeight; 
    for(i=0;i<(cnn->S2->outChannels);i++){ 
        if(cnn->S2->poolType==AvePool) 
            avgPooling(cnn->S2->y[i],outSize,cnn->C1->y[i],inSize,cnn->S2->mapSize); 
    } 
} 

这段代码我可以看到在输入图像卷积和池化之后值如何变化以及有多少特征图。 那么,我可以在 Tensorflow 上看到这样的结果吗?

我在 tensorflow\python\client\session.py 跟踪 Tensorflow 代码,代码像 blow

def _run_fn(session, feed_dict, fetch_list, target_list, options, 
            run_metadata): 
  # Ensure any changes to the graph are reflected in the runtime. 
  self._extend_graph() 
  with errors.raise_exception_on_not_ok_status() as status: 
    if self._created_with_new_api: 
      return tf_session.TF_SessionRun_wrapper( 
          session, options, feed_dict, fetch_list, target_list, 
          run_metadata, status) 
    else: 
      return tf_session.TF_Run(session, options, 
                               feed_dict, fetch_list, target_list, 
                               status, run_metadata) 

当函数“tf_session.TF_Run”执行时,它只返回(loss,Accuracy ), 但看不到该值如何更改。

然后我在 C:\Users\xxx\AppData\Local\Continuum\Anaconda3\envs\tensorflow1\Lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py 跟踪 Tensorflow 代码,代码像 blow

def TF_Run(session, run_options, feed_dict, output_names, target_nodes, out_status, run_outputs): 
    return _pywrap_tensorflow_internal.TF_Run(session, run_options, feed_dict, output_names, target_nodes, out_status, run_outputs) 
TF_Run = _pywrap_tensorflow_internal.TF_Run 

pywrap_tensorflow_internal.py 已经使用了_pywrap_tensorflow_internal.pyd,我认为这个.pyd 上的值如何改变。那么,这个 .pyd 源代码在哪里?因为这个 .pyd 只能通过“pip install tensorflow”下载。

请您参考如下方法:

我想你的意思是你想知道 tf.nn.conv2d 和排序是如何实现的。如果您是 TensorFlow 的新手,您会注意到有 layers(例如 tf.layers.conv2d)和 nn(例如 tf.nn.conv2d)。 layers 都是 nn 的包装器,因此如果您只想立即开始实现,请忽略 layers。

现在,如果您阅读 documentation for tf.nn.conv2d ,它说:

Defined in generated file: tensorflow/python/ops/gen_nn_ops.py.

只是为了比较,看看 documentation for tf.nn.conv2d_transpose ,它说:

Defined in tensorflow/python/ops/nn_ops.py.

现在,如果您单击 tensorflow/python/ops/nn_ops.py,它实际上会将您带到定义了 tf.nn.conv2d_transpose 的文件。但是对于您感兴趣的tf.nn.conv2d,这个链接不存在。这是因为您可以用 C++ 编写层并让 TensorFlow 生成 Python 部分,因此在生成的文件 中定义文本。实际的实现分布在此处的三个文件中: