hybrid_forward 参数问题

下面代码是全连接层的实现。可以看到 hybrid_forward 的输入参数为:
(self, F, x, weight, bias=None)。F是NDArray或者Symbol.
X是输入的值。 我们返现 weight, bias=None 并没有传入,而是通过
在__init__里用self.weight = self.params.get(…)以后,这个weight就会自动被传到hybrid_forward里。

    class Dense(HybridBlock):
    def __init__(self, units, activation=None, use_bias=True, flatten=True,
                 weight_initializer=None, bias_initializer='zeros',
                 in_units=0, **kwargs):
        super(Dense, self).__init__(**kwargs)
        self._flatten = flatten
        with self.name_scope():
            self._units = units
            self._in_units = in_units
            self.weight = self.params.get('weight', shape=(units, in_units),
                                          init=weight_initializer,
                                          allow_deferred_init=True)
            if use_bias:
                self.bias = self.params.get('bias', shape=(units,),
                                            init=bias_init
class HybridModel(nn.Module): def __init__(self): super(HybridModel, self).__init__() self.lstm = nn.LSTM(input_size=1, hidden_size=64, batch_first=True) self.conv = nn.Conv1d(in_channels=1, out_channels=64, kernel_size=3, padding='same') self.pool = nn.MaxPool1d(kernel_size=2) self.gru = nn.GRU(input_size=64, hidden_size=64, batch_first=True) self.fc = nn.Linear(64 + (64 * (time_window // 2)), 1) def forward(self, x): lstm_out, _ = self.lstm(x) conv_out = self.conv(x.transpose(1, 2)) conv_out = self.pool(conv_out) gru_out, _ = self.gru(lstm_out) gru_out = gru_out[:, -1, :] conv_out = conv_out.flatten(start_dim=1) combined_out = torch.cat((gru_out, conv_out), dim=1) output = self.fc(combined_out) return output hybrid_model = HybridModel() criterion = nn.MSELoss() optimizer = optim.Adam(hybrid_model.parameters(), lr=0.001) # 训练模型 num_epochs = 1500 train_losses = [] for epoch in range(num_epochs): outputs = hybrid_model(X_train) loss = criterion(outputs, y_train) optimizer.zero_grad() loss.backward() optimizer.step() train_losses.append(loss.item()) if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}') # 测试模型 hybrid_model.eval() with torch.no_grad(): y_hybrid_pred = hybrid_model(X_test) # 反归一化 y_hybrid_pred = scaler.inverse_transform(y_hybrid_pred.numpy()) # 评估指标 hybrid_mse = mean_squared_error(y_test, y_hybrid_pred) hybrid_mae = mean_absolute_error(y_test, y_hybrid_pred) hybrid_r2 = r2_score(y_test, y_hybrid_pred) print(f'Hybrid Model Mean Squared Error: {hybrid_mse:.4f}') print(f'Hybrid Model Mean Absolute Error: {hybrid_mae:.4f}') print(f'Hybrid Model R-squared: {hybrid_r2:.4f}')详细解释上述代码
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值