OCI env setting

前言

好久以前玩过OCI, 当时应该记录一下的。
这次想写个OCI的测试程序,客户端OCI开发环境问题弄的老费劲了。
OCIServerAttach那显示错误: ORA-12154: TNS: 无法解析指定的连接标识符.
为了解决OCI编程环境问题,纠结了好久.
上网查ORA-12154错误,解决方法都是千奇百怪的,因为每个人的开发环境和上下文都不同。
要不是集中时间来解决,还真搞不定。
解决问题时,查资料是一方面,自己捣鼓还是主要的,能遇到开发环境和上下文都和自己一样的问题答案还真是少见。

OCI开发环境设定要点

  • 服务器端的监听程序配置文件,要加入全局tns服务名称,然后重新停止,启动服务器端监听程序。

// C:\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora

# listener.ora Network Configuration File: C:\app\admin\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\admin\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\admin\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL)
      (ORACLE_HOME = C:\app\admin\product\11.2.0\dbhome_1)  
      (SID_NAME = ORCL)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.154.130)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = C:\app\admin
lsnrctl stop 
lsnrctl start 
lsnrctl status 
  • 只需要安装oracle客户端软件中的开发软件(第三项),不需要配置ODBC数据源。
  • OCIServerAttach要连接的是oracle客户端软件(网络配置助手)配置出来的TNS服务名称。
    要先用客户端的oracle网络助手先配置出监听程序和远端的服务名称
  • 工程要编译成win64的。

测试效果

connect local tns service name [orcl], user name = [system], password = [system]
do oci task
sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);
query result set :
sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);
query result set columns = 3
columns 1 :
        g_col_info[0].m_i_data_type_org = 1
        name = TOPIC
        name len = 5
        data len = 50
        g_col_info[0].m_i_data_type_now = 1
----------------------------------------
columns 2 :
        g_col_info[1].m_i_data_type_org = 2
        name = SEQ
        name len = 3
        data len = 22
        g_col_info[1].m_i_data_type_now = 1
----------------------------------------
columns 3 :
        g_col_info[2].m_i_data_type_org = 1
        name = INFO
        name len = 4
        data len = 80
        g_col_info[2].m_i_data_type_now = 1
----------------------------------------
row[0]col[0] = ACCEPT
row[0]col[1] = 1
row[0]col[2] =
----------------------------------------
row[1]col[0] = ACCEPT
row[1]col[1] = 2
row[1]col[2] =  ACCEPT
----------------------------------------
row[2]col[0] = ACCEPT
row[2]col[1] = 3
row[2]col[2] =  ------
----------------------------------------
row[3]col[0] = ACCEPT
row[3]col[1] = 4
row[3]col[2] =
----------------------------------------
row[4]col[0] = ACCEPT
row[4]col[1] = 5
row[4]col[2] =  Reads a line of input and stores it in a given substitution variable.
----------------------------------------
row[5]col[0] = ACCEPT
row[5]col[1] = 6
row[5]col[2] =
----------------------------------------
ok : db operation over
END
请按任意键继续. . .

测试程序

// @file oci_test_on_vs2017.cpp
// @brief test oci interface

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>

// OCI开发环境配置
// 远端oracle服务器端装好,配好TNS服务名称
//
// 安装oracle客户端软件时,选第3项(开发工具). 
// oracle客户端安装完后,用自带的网络助手配置监听器和远端的TNS服务名称
//
// 将工程设定为win64, 包含进OCI头文件和库文件.
// 在打开远端oracle服务器(进入服务器桌面)的情况下,就可以运行调试测试程序了.
// 不用配ODBS的DSN.

#include "oci.h"
// oci.lib is win64, win32编译不过.
#pragma comment(lib, "oci.lib")

// 用oracle网络助手配置的远端网络服务名称, 不是ODBC助手配置出来的dsn名称
#define REMOTE_TNS_SERVICE_NAME "orcl" // 服务名称不区分大小写
#define DB_USER_NAME "system"
#define DB_USER_PWD "system"

typedef struct _tag_col_info{
    char* m_psz_name;
    int m_i_len_name;

    int m_i_data_type_org;
    int m_i_data_type_now;
    char* m_psz_data;
    int m_i_len_data;

    _tag_col_info() {
        m_psz_name = NULL;
        m_i_len_name = 0;

        m_i_data_type_org = SQLT_CHR;
        m_i_data_type_now = SQLT_CHR;
        m_psz_data = NULL;
        m_i_len_data = 0;
    }

    void clear() {
        if (NULL != m_psz_name) {
            delete [] m_psz_name;
            m_psz_name = NULL;
        }

        if (NULL != m_psz_data) {
            delete [] m_psz_data;
            m_psz_data = NULL;
        }

        m_i_len_name = 0;
        m_i_len_data = 0;
        m_i_data_type_org = SQLT_CHR;
        m_i_data_type_now = SQLT_CHR;
    }
}TAG_COL_INFO;

std::string get_oci_error(const char* psz_tip, OCIError* h_oci_error);
void print_oci_error(const char* psz_tip, OCIError* h_oci_error);
void do_oci_task(OCIEnv* h_oci_env, OCIServer* h_oci_server, OCIError* h_oci_error, OCISvcCtx* h_oci_context, OCISession* h_oci_user);

void case_oci_opt();

int g_i_columns_cnt = 0;
TAG_COL_INFO g_col_info[100];

int _tmain(int argc, _TCHAR* argv[])
{
    case_oci_opt();

    printf("END\n");
    system("pause");
    return 0;
}

void case_oci_opt()
{
    sword sw_rc = 0;
    sword sw_tmp = 0;
    OCIEnv* h_oci_env = NULL; // 环境句柄
    OCIServer* h_oci_server = NULL; // 服务器句柄
    OCIError* h_oci_error = NULL; // 错误句柄
    OCISvcCtx* h_oci_context = NULL; // 上下文句柄
    OCISession* h_oci_user = NULL; // 用户句柄

    sb4 errcode = 0;
    char sz_buf[4096] = {'\0'};

    do {
        // 打印数据库连接信息
        printf("connect local tns service name [%s], user name = [%s], password = [%s]\r\n",
            REMOTE_TNS_SERVICE_NAME,
            DB_USER_NAME,
            DB_USER_PWD);

        // 创建环境句柄(线程和环境对象)
        sw_rc = OCIEnvCreate(&h_oci_env, OCI_THREADED | OCI_OBJECT, (dvoid*)0, 0, 0, 0, (size_t)0, (dvoid**)0);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create env handle", h_oci_error);
            break;
        }

        // 创建服务器句柄
        sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_server, OCI_HTYPE_SERVER, 0, (dvoid**)0);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create service handle", h_oci_error);
            break;
        }

        // 创建错误句柄
        sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_error, OCI_HTYPE_ERROR, 0, (dvoid**)0);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create error handle", h_oci_error);
            break;
        }

        // OCI连接的不是ODBC DSN名称
        // my_oracle_dsn
        // ORA-12154: TNS: 无法解析指定的连接标识符

        // OCI连接的是远端TNS服务名称
        // TNSPING ORCL
        // 成功

        // 如果远端的oracle服务器关了,这里会显示错误:连接超时
        // ORA-12170: TNS: 连接超时

        // 连接远程数据库(tns服务名称)
        sw_rc = OCIServerAttach(h_oci_server, h_oci_error,
            (text*)REMOTE_TNS_SERVICE_NAME,
            (sb4)strlen(REMOTE_TNS_SERVICE_NAME),
            OCI_DEFAULT);
        // packet 1~18

        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : remote database connect", h_oci_error);
            break;
        }

        // 创建上下文
        sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_context, OCI_HTYPE_SVCCTX, 0, (dvoid**)0);
        // packet 19~20
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create context", h_oci_error);
            break;
        }

        // 设置上下文属性
        sw_rc = OCIAttrSet((dvoid**)h_oci_context, OCI_HTYPE_SVCCTX, (dvoid*)h_oci_server, (ub4)0, OCI_ATTR_SERVER, h_oci_error);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : set context", h_oci_error);
            break;
        }

        // 创建用户句柄
        sw_rc = OCIHandleAlloc((dvoid*)h_oci_env, (dvoid**)&h_oci_user, OCI_HTYPE_SESSION, 0, (dvoid**)0);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create user", h_oci_error);
            break;
        }

        // 设置用户名
        sw_rc = OCIAttrSet((dvoid*)h_oci_user, OCI_HTYPE_SESSION, (dvoid*)DB_USER_NAME, (ub4)strlen(DB_USER_NAME), OCI_ATTR_USERNAME, h_oci_error);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : set user name", h_oci_error);
            break;
        }

        // 设置口令
        sw_rc = OCIAttrSet((dvoid*)h_oci_user, OCI_HTYPE_SESSION, (dvoid*)DB_USER_PWD, (ub4)strlen(DB_USER_PWD), OCI_ATTR_PASSWORD, h_oci_error);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : set user password", h_oci_error);
            break;
        }

        // 会话开始
        sw_rc = OCISessionBegin(h_oci_context, h_oci_error, h_oci_user, OCI_CRED_RDBMS, OCI_DEFAULT);
        // packet 21~26
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : session begin", h_oci_error);
            break;
        }

        // 在会话上设置用户信息
        sw_rc = OCIAttrSet((dvoid*)h_oci_context, OCI_HTYPE_SVCCTX, (dvoid*)h_oci_user, (ub4)0, OCI_ATTR_SESSION, h_oci_error);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : set user info on service handle", h_oci_error);
            break;
        }

        // 干活
        do_oci_task(h_oci_env, h_oci_server, h_oci_error, h_oci_context, h_oci_user);

        printf("ok : db operation over\r\n");
    } while (0);

    // 会话结束
    sw_rc = OCISessionEnd(h_oci_context, h_oci_error, h_oci_user, OCI_DEFAULT);
    // packet 39~41
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : end session", h_oci_error);
    }

    // 断开连接
    sw_rc = OCIServerDetach(h_oci_server, h_oci_error, OCI_DEFAULT);
    // packet 42`46
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : detach server", h_oci_error);
    }

    // --------------------------------------------------------------------------------
    // 释放句柄
    // --------------------------------------------------------------------------------
    sw_rc = OCIHandleFree((void*)h_oci_user, OCI_HTYPE_SESSION);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_SESSION", h_oci_error);
    }

    sw_rc = OCIHandleFree((void*)h_oci_context, OCI_HTYPE_SVCCTX);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_SVCCTX", h_oci_error);
    }

    sw_rc = OCIHandleFree((void*)h_oci_error, OCI_HTYPE_ERROR);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_ERROR", NULL);
    }

    sw_rc = OCIHandleFree((void*)h_oci_server, OCI_HTYPE_SERVER);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_SERVER", NULL);
    }

    sw_rc = OCIHandleFree((void*)h_oci_env, OCI_HTYPE_ENV);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_ENV", NULL);
    }
}

std::string get_oci_error(const char* psz_tip, OCIError* h_oci_error)
{
    char sz_buf[4096] = { '\0' };
    sword sw_rc = 0;
    sb4 errcode = 0;
    std::string str_rc = "";

    if (NULL != psz_tip) {
        str_rc += psz_tip;
    }

    str_rc += "\r\n";

    if (NULL != h_oci_error) {
        sw_rc = OCIErrorGet(
            h_oci_error,
            (ub4)1,
            (text*)NULL,
            &errcode,
            (OraText*)sz_buf,
            (ub4)sizeof(sz_buf),
            (b4)OCI_HTYPE_ERROR);

        if (OCI_SUCCESS == sw_rc) {
            str_rc += "\t";
            str_rc += sz_buf;
        }
    }

    return str_rc;
}

void print_oci_error(const char* psz_tip, OCIError* h_oci_error)
{
    printf("%s\r\n", get_oci_error(psz_tip, h_oci_error).c_str());
}

void do_oci_task(OCIEnv* h_oci_env, OCIServer* h_oci_server, OCIError* h_oci_error, OCISvcCtx* h_oci_context, OCISession* h_oci_user)
{
    // 从oracle原生数据库中选择一条唯一的记录
    // select * from help where topic = 'ACCEPT' AND SEQ = 7;

    // OraText* ora_text_select = (OraText*)"select * from help where topic = 'ACCEPT' AND SEQ = 7"; // 只有1条
    OraText* ora_text_select = (OraText*)"select * from help where topic = 'ACCEPT' AND SEQ < 7"; // 共7条

    sword sw_rc = 0;
    OCIStmt* h_oci_stmt = NULL; // SQL语句句柄
    OCIDefine* h_oci_define = NULL;
    OCIParam* h_oci_param = NULL;
    OraText* colName = NULL;
    ub4 colNameSize = 0;

    ub2 stmt_type = 0; // SQL语句类型
    ub4 fieldCount = 0; // 结果集字段数量
    ub4 i_index = 0;
    int i_row_index = 0;

    ub4 col_len = 0;
    ub4 col_lenSize = 0;
    int dtypeNew = 0;

    ub4 dtype = 0;

    do {
        if ((NULL == h_oci_env)
            || (NULL == h_oci_server)
            || (NULL == h_oci_error)
            || (NULL == h_oci_user)
            || (NULL == h_oci_context)) {
            printf("oci handle invalid\r\n");
            break;
        }

        printf("do oci task\r\n");

        // 建立SQL语句句柄
        sw_rc = OCIHandleAlloc(h_oci_env, (void**)&h_oci_stmt, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : create OCI_HTYPE_STMT", h_oci_error);
            break;
        }

        // 准备SQL语句
        sw_rc = OCIStmtPrepare(h_oci_stmt, h_oci_error, ora_text_select, (ub4)strlen((const char*)ora_text_select), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : OCIStmtPrepare", h_oci_error);
            break;
        }

        // 执行SQL
        printf("sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);\r\n");
        sw_rc = OCIStmtExecute(h_oci_context, h_oci_stmt, h_oci_error, (ub4)0, (ub4)0, (OCISnapshot*)0, (OCISnapshot*)0, OCI_DEFAULT);
        // packet 27~29
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : OCIStmtExecute", h_oci_error);
            break;
        }

        // 获取SQL语句类型
        sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &stmt_type, NULL, OCI_ATTR_STMT_TYPE, h_oci_error);
        if (OCI_SUCCESS != sw_rc) {
            print_oci_error("error : OCI_ATTR_STMT_TYPE", h_oci_error);
            break;
        }

        // 取结果集列信息
        if (OCI_STMT_SELECT == stmt_type) {
            printf("query result set :\r\n");

            printf("sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);\r\n");
            sw_rc = OCIAttrGet(h_oci_stmt, OCI_HTYPE_STMT, &fieldCount, NULL, OCI_ATTR_PARAM_COUNT, h_oci_error);
            if (OCI_SUCCESS != sw_rc) {
                print_oci_error("error : OCI_ATTR_STMT_TYPE", h_oci_error);
                break;
            }

            printf("query result set columns = %d\r\n", fieldCount);
            g_i_columns_cnt = fieldCount;

            for (i_index = 0; i_index < fieldCount; i_index++) {
                h_oci_param = NULL;
                dtype = 0;

                printf("columns %d : \r\n", i_index + 1);
                ub4 dtypeSize = sizeof(dtype);
                sw_rc = OCIParamGet(h_oci_stmt, OCI_HTYPE_STMT, h_oci_error, (void**)&h_oci_param, i_index + 1);
                if (OCI_SUCCESS != sw_rc)
                {
                    print_oci_error("error : OCIParamGet", h_oci_error);
                    break;
                }

                sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &dtype, &dtypeSize, OCI_ATTR_DATA_TYPE, h_oci_error);
                if (OCI_SUCCESS != sw_rc)
                {
                    print_oci_error("error : OCIAttrGet", h_oci_error);
                    break;
                }

                g_col_info[i_index].m_i_data_type_org = (int)dtype;
                printf("\tg_col_info[%d].m_i_data_type_org = %d\r\n", i_index, g_col_info[i_index].m_i_data_type_org);

                colName = NULL;
                colNameSize = sizeof(colName);
                sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &colName, &colNameSize, OCI_ATTR_NAME, h_oci_error);
                if (OCI_SUCCESS != sw_rc)
                {
                    print_oci_error("error : OCIAttrGet", h_oci_error);
                    break;
                }

                g_col_info[i_index].m_i_len_name = (int)colNameSize;
                g_col_info[i_index].m_psz_name = new char[g_col_info[i_index].m_i_len_name + 1];
                memset(g_col_info[i_index].m_psz_name, 0, g_col_info[i_index].m_i_len_name + 1);
                strcpy_s(g_col_info[i_index].m_psz_name, g_col_info[i_index].m_i_len_name + 1, (char*)colName);

                printf("\tname = %s\r\n", (char*)colName);
                printf("\tname len = %d\r\n", (int)colNameSize);

                col_len = 0;
                col_lenSize = sizeof(col_len);
                dtypeNew = SQLT_CHR;
                switch (dtype)
                {
                case SQLT_DAT:
                case SQLT_DATE:
                case SQLT_TIME:
                case SQLT_TIME_TZ:
                case SQLT_TIMESTAMP:
                case SQLT_TIMESTAMP_TZ:
                case SQLT_TIMESTAMP_LTZ:
                {
                    dtypeNew = SQLT_ODT;
                    col_len = sizeof(OCIDate);
                }
                break;
                case SQLT_CLOB:
                case SQLT_CHR:
                case SQLT_INT:
                case SQLT_UIN:
                case SQLT_NUM:
                case SQLT_FLT:
                case SQLT_STR:
                case SQLT_VNU:
                case SQLT_LNG:
                case SQLT_VCS:
                case SQLT_LVC:
                case SQLT_AFC:
                case SQLT_AVC:
                {
                    sw_rc = OCIAttrGet(h_oci_param, OCI_DTYPE_PARAM, &col_len, &col_lenSize, OCI_ATTR_DATA_SIZE, h_oci_error);
                    if (OCI_SUCCESS != sw_rc)
                    {
                        print_oci_error("error : OCIAttrGet", h_oci_error);
                        break;
                    }

                    printf("\tdata len = %d\r\n", (int)col_len);
                    dtypeNew = SQLT_CHR;
                }
                break;
                default:
                    // assert(0);
                    break;
                }

                g_col_info[i_index].m_i_data_type_now = (int)dtypeNew;
                printf("\tg_col_info[%d].m_i_data_type_now = %d\r\n", i_index, g_col_info[i_index].m_i_data_type_now);

                g_col_info[i_index].m_i_len_data = (int)col_len;
                g_col_info[i_index].m_psz_data = new char[g_col_info[i_index].m_i_len_data + 1];
                memset(g_col_info[i_index].m_psz_data, 0, g_col_info[i_index].m_i_len_data + 1);

                h_oci_define = NULL;
                sw_rc = OCIDefineByPos(h_oci_stmt, &h_oci_define, h_oci_error, i_index + 1, g_col_info[i_index].m_psz_data, col_len * sizeof(char), dtypeNew, 0, 0, 0, OCI_DEFAULT);
                if (OCI_SUCCESS != sw_rc)
                {
                    print_oci_error("error : OCIDefineByPos", h_oci_error);
                    break;
                }

                printf("----------------------------------------\r\n");
            }
        }

        // 遍历行集
        i_row_index = 0;
        do {
            sw_rc = OCIStmtFetch(h_oci_stmt, h_oci_error, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
            // 如果是查第一行,并不发收包,可能执行后,返回的数据中已经包含第一行
            // packet 30~32 如果数据不够了,会继续请求包。
            // packet 33~35
            // packet 36~38
            if (OCI_NO_DATA == sw_rc)
            {
                break;
            }

            for (i_index = 0; i_index != g_i_columns_cnt; i_index++)
            {
                printf("row[%d]col[%d] = %s\r\n", i_row_index, i_index, (NULL != g_col_info[i_index].m_psz_data) ? g_col_info[i_index].m_psz_data : "NULL");
            }
            printf("----------------------------------------\r\n");
            i_row_index++;
        } while (1);

        // 释放资源
        for (i_index = 0; i_index != g_i_columns_cnt; i_index++)
        {
            g_col_info[i_index].clear();
        }
    } while (0);

    // 释放oci句柄
    sw_rc = OCIHandleFree((void*)h_oci_stmt, OCI_HTYPE_STMT);
    if (OCI_SUCCESS != sw_rc) {
        print_oci_error("error : OCI_HTYPE_STMT", NULL);
    }
}
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值