构建神经网络:从Python脚本到全连接层实现
立即解锁
发布时间: 2025-09-01 00:57:00 阅读量: 4 订阅数: 13 AIGC 

### 构建神经网络:从Python脚本到全连接层实现
#### 1. Python脚本结构描述
在构建神经网络模型时,我们需要对训练好的模型进行测试,以评估其性能。下面是一个Python脚本示例,用于将测试样本划分为原始数据和目标数据,并使用Keras库的`evaluate`方法检查模型在测试样本上的质量。
```python
# Dividing the test sample into raw data and targets
test_data=test[:,0:inputs]
test_target=test[:,inputs:]
# Validation of model results on test sample
ltest_loss, test_acc = model.evaluate(test_data, test_target)
# Logging test results
print('Model in test')
print('Test accuracy:', test_acc)
print('Test loss:', test_loss)
# Output of created charts
plt.show()
```
`evaluate`方法有多个参数可用于自定义测试过程:
| 参数 | 描述 |
| ---- | ---- |
| x | 测试样本的初始数据数组 |
| y | 测试样本目标数组 |
| batch_size | 测试批次的大小 |
| verbose | 过程日志详细模式(0 - 无日志,1 - 进度指示) |
| sample_weight | 用于加权损失函数的可选参数 |
| steps | 声明测试过程完成的总步骤数 |
| callbacks | 训练过程中使用的回调列表 |
| return_dict | 定义方法输出格式的布尔变量(True = 作为“指标 - 值”字典,False = 作为列表) |
大多数参数是可选的,并且有默认值。在大多数情况下,只需提供数据数组即可启动测试过程。
#### 2. 全连接神经网络层概述
全连接神经网络层是神经网络的重要组成部分,它在感知机(Perceptron)中得到了广泛应用。在这种架构中,每一层的每个神经元都与前一层的所有神经元相连,每个连接都有自己的权重因子。
从向量数学的角度来看,输入值向量在N维空间中表示一个特定的点,每个神经元将这个点投影到自己的向量上,激活函数决定是否进一步传输信号。为了补偿投影相对于坐标原点的位移,每个神经元引入了一个额外的常数`bias`。
#### 3. 全连接层的架构和实现原则
在构建神经网络的基类和动态数组来存储神经元层的指针时,我们定义了神经网络管理器与其组件之间的数据交换的主要方法和接口。以下是全连接层实现的关键步骤:
- **类继承**:所有神经网络层对象必须是`CObject`基类的后代。
- **构造函数和析构函数**:在类构造函数中初始化内部变量和常量,在析构函数中进行内存清理。
- **初始化方法`Init`**:接收`CLayerDescription`类的实例,创建神经网络层的内部架构,包括创建存储数据的数组。
```mermaid
graph TD;
A[开始] --> B[检查输入参数];
B --> C{是否有效};
C -- 是 --> D[验证缓冲区并初始化];
C -- 否 --> E[返回false];
D --> F{是否有前一层};
F -- 是 --> G[初始化激活函数];
F -- 否 --> H[移除无用特征];
G --> I[初始化权重矩阵];
I --> J[初始化缓冲区和动量矩阵];
J --> K[保存优化方法];
K --> L[返回true];
H --> M[保存优化方法];
M --> N[返回true];
```
#### 4. 使用MQL5工具创建神经网络层
我们创建了一个继承自`CObject`类的神经网络层基类`CNeuronBase`,并定义了内部变量:
```cpp
class CNeuronBase : public CObject
{
protected:
bool m_bTrain;
CMyOpenCL* m_cOpenCL;
CActivation* m_cActivation;
ENUM_OPTIMIZATION m_eOptimization;
CBufferType* m_cOutputs;
CBufferType* m_cWeights;
CBufferType* m_cDeltaWeights;
CBufferType* m_cGradients;
CBufferType* m_cMomenum[2];
//---
virtual bool SGDUpdate(int batch_size, TYPE learningRate,
VECTOR &Lambda);
virtual bool MomentumUpdate(int batch_size, TYPE learningRate,
VECTOR &Beta, VECTOR &Lambda);
virtual bool AdaGradUpdate(int batch_size, TYPE learningRate,
VECTOR &Lambda);
virtual bool RMSPropUpdate(int batch_size, TYPE learningRate,
VECTOR &Beta, VECTOR &Lambda);
virtual bool AdaDeltaUpdate(int batch_size,
VECTOR &Beta, VECTOR &Lambda);
virtual bool AdamUpdate(int batch_size, TYPE learningRate,
VECTOR &Beta, VECTOR &Lambda);
virtual bool SetActivation(ENUM_ACTIVATION_FUNCTION function,
VECTOR ¶ms);
public:
CNeuronBase(void);
~CNeuronBase(void);
//---
virtual bool Init(const CLayerDescription *description);
virtual bool SetOpenCL(CMyOpenCL *opencl);
virtual bool FeedForward(CNeuronBase *prevLayer);
virtual bool CalcOutputGradient(CBufferType *target,
ENUM_LOSS_FUNCTION loss);
virtual bool CalcHiddenGradient(CNeuronBase *prevLayer);
virtual bool CalcDeltaWeights(CNeuronBase *prevLayer);
virtual bool UpdateWeights(int batch_size, TYPE learningRate,
VECTOR &Beta, VECTOR &Lambda);
virtual void TrainMode(bool flag) { m_bTrain = flag; }
virtual bool TrainMode(void) const { return m_bTrain; }
//---
CBufferType *GetOutputs(void) const { return(m_cOutputs); }
CBufferType *GetGradients(void) const { return(m_cGradients); }
CBufferType *GetWeights(void) const { return(m_cWeights); }
CBufferType *GetDeltaWeights(void) const { return(m_cDeltaWeights); }
};
```
- **构造函数**:初始化变量并创建所需的类实例。
```cpp
CNeuronBase::CNeuronBase(void) : m_eOptimization(Adam)
{
m_cOpenCL = NULL;
m_cActivation = new CActivationSwish();
m_cOutputs = new CBufferType();
m_cWeights = new CBufferType();
m_cDeltaWeights = new CBufferType();
m_cGradients = new CBufferType();
m_cMomenum[0] = new CBufferType();
m_cMomenum[1] = new CBufferType();
}
```
- **析构函数**:清理内存。
```cpp
CNeuronBase::~CNeuronBase(void)
{
if(!!m_cActivation)
delete m_cActivation;
if(!!m_cOutputs)
delete m_cOutputs;
if(!!m_cWeights)
delete m_cWeights;
if(!!m_cDeltaWeights)
delete m_cDeltaWeights;
if(!!m_cGradients)
delete m_cGradients;
if(!!m_cMomenum[0])
delete m_cMomenum[0];
if(!!m_cMomenum[1])
delete m_cMomenum[1];
}
```
- **初始化方法`Init`**:检查输入参数,验证和初始化缓冲区,初始化激活函数和权重矩阵。
```cpp
bool CNeuronBase::Init(const CLayerDescription *desc)
{
//--- source data control block
if(!desc || desc.type != Type() || desc.count <= 0)
return false;
//--- creating a results buffer
if(!m_cOutputs)
if(!(m_cOutputs = new CBufferType()))
return false;
if(!m_cOutputs.BufferInit(1, desc.count, 0))
return false;
//--- creating error gradient buffer
if(!m_cGradients)
if(!(m_cGradients = new CBufferType()))
return false;
if(!m_cGradients.BufferInit(1, desc.count, 0))
return false;
//--- removing unused features for the source data layer
if(desc.window <= 0)
{
if(m_cActivation)
delete m_cActivation;
if(m_cWeights)
delete m_cWeights;
if(m_cDeltaWeights)
delete m_cDeltaWeights;
if(m_cMomenum[0])
delete m_cMomenum[0];
if(m_cMomenum[1])
delete m_cMomenum[1];
if(m_cOpenCL)
if(!m_cOutputs.BufferCreate(m_cOpenCL))
return false;
m_eOptimization = desc.optimization;
return true;
}
//--- initializing an activation function object
VECTOR ar_temp = desc.activation_params;
if(!SetActivation(desc.activation, ar_temp))
r
```
0
0
复制全文
相关推荐










