Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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
在Pytorch中培训1D CNN_Pytorch_Cnn - Fatal编程技术网

在Pytorch中培训1D CNN

在Pytorch中培训1D CNN,pytorch,cnn,Pytorch,Cnn,我想训练下面给出的模型。我正在PyTorch中开发1D CNN模型。通常我们在PyTorch中使用数据加载程序。但我并没有在我的实现中使用数据加载器。我需要关于如何在pytorch中训练我的模特的指导 我正在这样训练我的人际网络: 但是我得到了以下错误 请指导我如何解决此问题。模型的forward方法只接受一个参数,但您使用两个参数调用它: 输出=模型输入,批次大小 应该是: 输出=模型输入 时间序列数据使用5个元素的窗口。目标是5的滚动窗口。卷积1d模型接收一个销售张量三维结构,其中包含一定时

我想训练下面给出的模型。我正在PyTorch中开发1D CNN模型。通常我们在PyTorch中使用数据加载程序。但我并没有在我的实现中使用数据加载器。我需要关于如何在pytorch中训练我的模特的指导

我正在这样训练我的人际网络:

但是我得到了以下错误


请指导我如何解决此问题。

模型的forward方法只接受一个参数,但您使用两个参数调用它:

输出=模型输入,批次大小 应该是:

输出=模型输入
时间序列数据使用5个元素的窗口。目标是5的滚动窗口。卷积1d模型接收一个销售张量三维结构,其中包含一定时间内的所有销售。内核设置为5以匹配移动窗口大小。输入和输出为1。损失函数的计算时间超过1000个历元。然后将预测张量转换为numpy数组,并将其与实际移动平均值进行比较显示。我确实找到了iterate_minibatches代码,但它不适用于时间序列数据,因为维度是32目标与36源不同的

import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

df=pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/shampoo.csv')

#created a three dimensional tensor
#1. number of samples
#2. number of channels
#3. -1 means infer value from dimension

X=data.Sales.copy()
y=data.Sales.rolling(5).mean().copy()

net = nn.Conv1d(1, 1, 5,  bias = False)
optimizer=optim.Adam(net.parameters(), lr=0.01) #l2
running_loss=0.0

X=data.Sales.copy()
y=data.Sales.rolling(5).mean().copy()


X_tensor = torch.Tensor(X).reshape(1, 1, -1)
print("Sales", X_tensor)
y=y[4:,].to_numpy()
y_tensor = torch.Tensor(y).reshape(1, 1, -1)
print("Avg", y_tensor)

ts_tensor = torch.Tensor(X).reshape(1, 1, -1)
kernel = [0.5, 0.5]
kernel_tensor = torch.Tensor(kernel).reshape(1, 1, -1)
print("Kernel", F.conv1d(ts_tensor, kernel_tensor))

for epoch in range(1000):
    optimizer.zero_grad()
    outputs=net(X_tensor)
    #print("Outputs",outputs)
    loss_value = torch.mean((outputs - y_tensor)**2)
    loss_value.backward()
    optimizer.step()
    
    running_loss += loss_value.item()

    if epoch % 100 == 0:
        print('[%d] loss: %.3f' % (epoch, loss_value.item()))
        print(net.weight.data.numpy())
        
        
prediction = (net(X_tensor).data).float()
prediction=(prediction.numpy().flatten())
data.Sales.plot()
plt.plot(prediction)

#actual moving average
data.Sales.plot()
plt.plot(y)

谢谢你的回复。当我像这样更改代码时,会发生以下错误。RuntimeError:三维权重128 52 7应为三维输入,但得到的是大小为[64,1,23,52]的四维输入。请确保您的输入有3维,即[batch_size,num_Channel,width]。这样做的目的是通过添加更多层,使功能映射越来越小。最后的特征图被展平为一个向量。以下是何时使用conv1d的说明。这篇文章解释了如何将conv1d应用于时间序列数据。这篇文章解释了使用时间序列的卷积1。你们有11个标签吗?
criterion = nn.CrossEntropyLoss()    
opt = torch.optim.Adam(model.parameters(),lr=learning_rate)


for e in range(training_epochs):
  if(train_on_gpu):
     net.cuda()
    train_losses = []    

   for batch in iterate_minibatches(train_x, train_y, batch_size):
      x, y = batch
      inputs, targets = torch.from_numpy(x), torch.from_numpy(y)
      if(train_on_gpu):
        inputs, targets = inputs.cuda(), targets.cuda()
      opt.zero_grad()   
      output = model(inputs, batch_size)

    loss = criterion(output, targets.long())
    train_losses.append(loss.item())
    loss.backward()
    opt.step()
val_losses = []
accuracy=0
f1score=0
print("Epoch: {}/{}...".format(e+1, training_epochs),
              "Train Loss: {:.4f}...".format(np.mean(train_losses)))
          TypeError                                 Traceback (most recent call last)
          <ipython-input-60-3a3df06ef2f8> in <module>
   14             inputs, targets = inputs.cuda(), targets.cuda()
   15         opt.zero_grad()
   ---> 16         output = model(inputs, batch_size)
   17 
   18         loss = criterion(output, targets.long())

   ~\AppData\Local\Continuum\anaconda3\lib\site-packages\torch\nn\modules\module.py in __call__(self, 
   * input, **kwargs)
   530             result = self._slow_forward(*input, **kwargs)
   531         else:
   --> 532             result = self.forward(*input, **kwargs)
   533         for hook in self._forward_hooks.values():
   534             hook_result = hook(self, input, result)

   TypeError: forward() takes 2 positional arguments but 3 were given
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

df=pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/shampoo.csv')

#created a three dimensional tensor
#1. number of samples
#2. number of channels
#3. -1 means infer value from dimension

X=data.Sales.copy()
y=data.Sales.rolling(5).mean().copy()

net = nn.Conv1d(1, 1, 5,  bias = False)
optimizer=optim.Adam(net.parameters(), lr=0.01) #l2
running_loss=0.0

X=data.Sales.copy()
y=data.Sales.rolling(5).mean().copy()


X_tensor = torch.Tensor(X).reshape(1, 1, -1)
print("Sales", X_tensor)
y=y[4:,].to_numpy()
y_tensor = torch.Tensor(y).reshape(1, 1, -1)
print("Avg", y_tensor)

ts_tensor = torch.Tensor(X).reshape(1, 1, -1)
kernel = [0.5, 0.5]
kernel_tensor = torch.Tensor(kernel).reshape(1, 1, -1)
print("Kernel", F.conv1d(ts_tensor, kernel_tensor))

for epoch in range(1000):
    optimizer.zero_grad()
    outputs=net(X_tensor)
    #print("Outputs",outputs)
    loss_value = torch.mean((outputs - y_tensor)**2)
    loss_value.backward()
    optimizer.step()
    
    running_loss += loss_value.item()

    if epoch % 100 == 0:
        print('[%d] loss: %.3f' % (epoch, loss_value.item()))
        print(net.weight.data.numpy())
        
        
prediction = (net(X_tensor).data).float()
prediction=(prediction.numpy().flatten())
data.Sales.plot()
plt.plot(prediction)

#actual moving average
data.Sales.plot()
plt.plot(y)