Saya mencoba membangun cnn dengan wadah berurutan dari PyTorch, masalah saya adalah saya tidak tahu cara meratakan lapisan.

main = nn.Sequential()
self._conv_block(main, 'conv_0', 3, 6, 5)
main.add_module('max_pool_0_2_2', nn.MaxPool2d(2,2))
self._conv_block(main, 'conv_1', 6, 16, 3)
main.add_module('max_pool_1_2_2', nn.MaxPool2d(2,2)) 
main.add_module('flatten', make_it_flatten)

Apa yang harus saya masukkan ke dalam "make_it_flatten"? Saya mencoba meratakan yang utama tetapi tidak berhasil, yang utama tidak ada sesuatu yang disebut view

main = main.view(-1, 16*3*3)
9
StereoMatching 9 Agustus 2017, 11:01

2 jawaban

Jawaban Terbaik

Ini mungkin bukan yang Anda cari, tetapi Anda cukup membuat nn.Module Anda sendiri yang meratakan input apa pun, yang kemudian dapat Anda tambahkan ke objek nn.Sequential():

class Flatten(nn.Module):
    def forward(self, x):
        return x.view(x.size()[0], -1)

x.size()[0] akan memilih batch redup, dan -1 akan menghitung semua redup yang tersisa agar sesuai dengan jumlah elemen, sehingga meratakan tensor/Variabel apa pun.

Dan menggunakannya di nn.Sequential:

main = nn.Sequential()
self._conv_block(main, 'conv_0', 3, 6, 5)
main.add_module('max_pool_0_2_2', nn.MaxPool2d(2,2))
self._conv_block(main, 'conv_1', 6, 16, 3)
main.add_module('max_pool_1_2_2', nn.MaxPool2d(2,2)) 
main.add_module('flatten', Flatten())
18
cleros 9 Agustus 2017, 13:49

Cara tercepat untuk meratakan layer adalah dengan tidak membuat modul baru dan menambahkan modul tersebut ke main melalui main.add_module('flatten', Flatten()).

class Flatten(nn.Module):
    def forward(self, input):
        return input.view(input.size(0), -1)

Sebagai gantinya, out = inp.reshape(inp.size(0), -1) sederhana di dalam forward model Anda lebih cepat seperti yang saya tunjukkan di di sini.

2
prosti 26 Juni 2019, 12:13