簡體   English   中英

類型錯誤:預計 numpy.ndarray 或 cuda.ndarray

[英]TypeError: numpy.ndarray or cuda.ndarray are expected

我想在chainer中訓練Convolution3d模型。 在我的訓練中,我有這個錯誤。

TypeError: numpy.ndarray or cuda.ndarray are expected.

我認為錯誤的原因是輸入是一個列表。 所以,我將輸入數組更改為 numpy 數組。但我有同樣的錯誤。

這是火車代碼。

model = conv_3d()
model.to_gpu(0)


optimizer = optimizers.MomentumSGD(lr=0.01, momentum=0.9)

optimizer.setup(model)

max_epoch = 100
batch_size = 50

epoch_idx = 0

while epoch_idx < max_epoch:

    train_path = random.sample(train_path, len(train_path))


    train_losses = []
    for i in range(int(len(train_path) // batch_size)):



        batch = train_path[i * batch_size: (i+1) * batch_size]
        input_movie, target_movie = loader(batch)

        prediction_train = model(input_movie)
        loss = F.mean_squared_error(prediction_train,target_movie)

        train_losses.append(to_cpu(loss.array))

        model.cleargrads()
        loss.backward()

        optimizer.update()

    print('epoch:{:03d} train_loss:{:.04f} '.format(epoch_idx + 1, np.mean(train_losses)), end='')

    test_losses = []
    for test_batch in range(len(validation)//batch_size):

        batch = validation[test_batch * batch_size:(test_batch + 1) * 50]
        validation_input_movie, validation_target_movie = loader(batch)

        prediction_validation = model(validation_input_movie)

        loss_validation = F.mean_squared_error(prediction_validation,validation_target_movie)
        test_losses.append(to_cpu(loss_test.array))


    print('val_loss:{:.04f}'.format(
            np.mean(test_losses)))

    epoch_idx += 1

這是加載程序功能

def loader(path_list):

    input_movie = [i[0] for i in path_list]
    target_movie = [i[1] for i in path_list]

    input_movie = np.asarray([[np.asarray(cv2.resize(cv2.imread("../image/" + img),(1024//10,780//10))) for img in img_path] for img_path in input_movie])
    target_movie = np.asarray([[np.asarray(cv2.resize(cv2.imread("../image/" + img),(1024//10,780//10))) for img in img_path] for img_path in target_movie])
    return tuple([input_movie,target_movie])

這是模型

class conv_3d(Chain):
    def __init__(self):
        super(conv_3d, self).__init__()
        with self.init_scope():
            self.conv1 = L.Convolution3D(None,out_channels=3, ksize=3, stride=1, pad=1)
    def __call__(self,x):
        return F.relu(self.conv1)

我希望火車能正常工作,但我有上述錯誤。

F.relu(self.conv1)應該固定為F.relu(self.conv1(x)) 您可能還需要將輸入發送到 GPU。

我認為你是chainer.dataset.concat_examples ( docs )。

此函數將List[Tuple[array]]類型轉換為Tuple[array]類型。

import numpy as np
from chainer.dataset import concat_examples

path_list = [['/usr/1/in', '/usr/1/out'], ['/usr/2/in', '/usr/2/out'], ['/usr/3/in', '/usr/3/out']]

input_batch, output_batch = concat_examples([(cv2.imread(path[0]), cv2.imread(path[1])) for path in path_list], device='cuda:0')

print(type(input_batch)) // <class 'cupy.ndarray'>
print(type(output_batch)) // <class 'cupy.ndarray'>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM