Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neural network 将要素提取到文本文件_Neural Network_Caffe_Lmdb - Fatal编程技术网

Neural network 将要素提取到文本文件

Neural network 将要素提取到文本文件,neural-network,caffe,lmdb,Neural Network,Caffe,Lmdb,遵循中的步骤 要从训练后的新图像中提取特征 最终会得到一个data.mdb文件 我更喜欢将功能写入txt文件,以便可以轻松地对其进行操作 我在谷歌上搜索了一下,找到了一些代码,但没有成功。此外,在mac上使用mdb opener应用程序打开生成的data.mdb文件时,根本不显示任何表 是否有一种简单的方法将提取的特征写入文本文件,或者,可以方便地操作MDB文件,以便我们可以检查每个图像的实际值? < P> C++的C+接口提供了一些LMDB功能来读取数据,然后将其写回。 你可以看看LMDBDa

遵循中的步骤 要从训练后的新图像中提取特征

最终会得到一个data.mdb文件

我更喜欢将功能写入txt文件,以便可以轻松地对其进行操作

我在谷歌上搜索了一下,找到了一些代码,但没有成功。此外,在mac上使用mdb opener应用程序打开生成的data.mdb文件时,根本不显示任何表


是否有一种简单的方法将提取的特征写入文本文件,或者,可以方便地操作MDB文件,以便我们可以检查每个图像的实际值?

< P> C++的C+接口提供了一些LMDB功能来读取数据,然后将其写回。
你可以看看LMDBDataLayer如何执行它的读取,然后用它作为参考来编写一个程序来操作/写入LMDB数据库中的文本数据。

我不知道你是否已经知道如何解决这个问题,但这是我最近才发现的

我是新来的咖啡馆,我发现很难理解整个咖啡馆的建筑。我只是想用一种快速的方法从Caffe的CNN中提取特征,然后再进行操作。此外,我在OSX上工作,没有从源代码安装Caffe。我是通过“端口”安装的,安装似乎不完整。所以我在另一台安装了Caffe的机器上运行了Caffe的“feature_extractor”,并将输出文件复制到我的机器上进行进一步处理

为此,您必须在您的计算机上安装LMDB和Google的Protobuf。您必须将C/C++程序与liblmdb和libprotobuf链接起来

我按照Caffe的教程将AlexNet层“fc7”的输出保存到LMDB格式的文件中。然后我编写了一个简单的C/C++程序来读取它。这可以使用以下代码完成:

#include <fstream>
#include <iostream>
#include <lmdb.h>

using namespace std;

int main( int argc, char *argv[] )
{
    if( argc!=2 )
    {
        cerr<< "Error"<< endl
            << "Usage : "<< argv[0]<< " mdb_dirname"<< endl;
        return 0;
    }
    char *mdb_dirname     = argv[1];

    int rc;
    MDB_env *env;
    MDB_dbi dbi;
    MDB_val key, data;
    MDB_txn *txn;
    MDB_cursor *cursor;
    char sval[32];

    rc = mdb_env_create(&env);
    rc = mdb_env_open(env, mdb_dirname, 0, 0664);
    rc = mdb_txn_begin(env, NULL, 0, &txn);
    rc = mdb_open(txn, NULL, 0, &dbi);
    rc = mdb_cursor_open(txn, dbi, &cursor);

    key.mv_size  = sizeof(int);
    key.mv_data  = sval;
    data.mv_size = sizeof(sval);
    data.mv_data = sval;

    while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0)
    {
        printf("key: %p %d %.*s, data: %p %d  %.*s\n",
               key.mv_data,  (int) key.mv_size,  (int) key.mv_size,  (char *) key.mv_data,
               data.mv_data, (int) data.mv_size, (int) data.mv_size, (char *) data.mv_data);
    }
    mdb_cursor_close(cursor);
    mdb_txn_abort(txn);

    mdb_close(env, dbi);
    mdb_env_close(env);

    return 0;
}
然后,您可以通过以下方式将“data.mv_data”转换为特征向量:

    while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0)
    {
        string str( (char*)data.mv_data, (int)data.mv_size );

        datum.ParseFromString( str ); 

        if( datum.float_data_size()>0 )
        {
            // datum.float_data_size() is the dimension of the feature vectors
            for( int i = 0; i < datum.float_data_size(); i++ )
            {
                float f = datum.float_data(i);
                // do something
            }
        }
    }
while((rc=mdb\u cursor\u get(cursor,&key,&data,mdb\u NEXT))==0)
{
字符串str((char*)data.mv_data,(int)data.mv_size);
datum.ParseFromString(str);
if(基准面浮点数数据大小()>0)
{
//datum.float_data_size()是特征向量的尺寸
对于(int i=0;i
当我构建上面的代码时,有很多链接错误,比如未定义的引用…和其他与Protobuf相关的东西。如果遇到同样的问题,我发现的解决方案是将程序链接到libprotobuf.a,而不是简单的-llmdb(静态链接而不是动态链接)

另一个小问题是,我为“feature_extractor”处理的文件中的每个示例指定的标签丢失了。我不知道为什么。所以我把这些标签放在一个单独的文件中,并沿着LMDB文件进行处理。例如,如果要输出LIBSVM文件:

    int c = 0;
    while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0)
    {
        string str( (char*)data.mv_data, (int)data.mv_size );
        datum.ParseFromString( str ); 
        if( datum.float_data_size()>0 )
        {
            cout<< label[c]<< " ";
            for( int i = 0; i < datum.float_data_size(); i++ )
            {
                float f = datum.float_data(i);
                cout<< (i+1)<< ":"<< f<< " ";
            }
            cout<< endl;
            c++;
        }
    }
intc=0;
while((rc=mdb\u cursor\u get(cursor,&key,&data,mdb\u NEXT))==0)
{
字符串str((char*)data.mv_data,(int)data.mv_size);
datum.ParseFromString(str);
if(基准面浮点数数据大小()>0)
{
库特
    int c = 0;
    while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0)
    {
        string str( (char*)data.mv_data, (int)data.mv_size );
        datum.ParseFromString( str ); 
        if( datum.float_data_size()>0 )
        {
            cout<< label[c]<< " ";
            for( int i = 0; i < datum.float_data_size(); i++ )
            {
                float f = datum.float_data(i);
                cout<< (i+1)<< ":"<< f<< " ";
            }
            cout<< endl;
            c++;
        }
    }