Tôi muốn tạo hai tensor phụ từ một ma trận, sử dụng chỉ mục để chọn các hàng tương ứng. Một bộ điều khiển con có nhiều hàng và bộ kia chỉ có một hàng sẽ được phát sóng để cho phép bổ sung phần tử.
Câu hỏi của tôi là: Làm cách nào để cho biết rằng tôi muốn cho phép phát sóng trên một thứ nguyên cụ thể trong bộ điều chỉnh phụ ở một chỉ mục nhất định (trong ví dụ bên dưới subtensorRight
)?
Đây là một ví dụ cho thấy những gì tôi muốn làm:
nhập khẩu theano
nhập numpy dưới dạng np
nhập theano.tensor dưới dạng T
def embedding_matrix(D, N, name):
W_values = np.random.uniform(size=(D, N))
trả về theano.shared(value=W_values, name=name)
rE = embedding_matrix(4, 5, "rE")
lis = T.ivector('lis')# [1,2]
subtensorLeft = rE[lis,:]
ri = T.ivector('ri')#[1]
subtensorRight = rE[ri,:]
def fnsim(trái, phải):
return - T.sqrt(T.sum(T.sqr(trái - phải), axis=1))
khoảng cách_test = theano.function(
đầu vào=[lis, ri],
đầu ra=fnsim(subtensorLeft, subtensorRight)
)
in khoảng cách_test([1,2],[1])
Nó ném lỗi này:
ValueError: Kích thước đầu vào không khớp (input[0].shape[0] = 2, input[1].shape[0] = 1)
Áp dụng nút gây ra lỗi: Elemwise{Composite{sqr((i0 - i1))}[(0, 0)](AdvancedSubtensor1.0, AdvancedSubtensor1.0)
Chỉ số Toposort: 2
Các loại đầu vào: [TensorType(float64, ma trận), TensorType(float64, ma trận)]
Hình dạng đầu vào: [(2, 5), (1, 5)]
Bước tiến đầu vào: [(40, 8), (40, 8)]
Giá trị đầu vào: ['không hiển thị', mảng([[ 0.39528934, 0.4414946 , 0.36837258, 0.52523446, 0.35431748]])]
Ứng dụng khách đầu ra: [[Sum{axis=[1], acc_dtype=float64}(Elemwise{Composite{sqr((i0 - i1))}[(0, 0)].0)]]
===
Cập nhật 1:
Khi định hình lại theo cách này subtensorRight
Khi , nó dừng nhắc và cho kết quả như mong đợi:
subtensorRight = rE[ri,:]
subtensorRight = subtensorRight.reshape((1, subtensorRight.shape[1]))
Câu hỏi: Đây có phải là cách tiếp cận đúng?
更新 2:
Nếu tôi cố gắng định hình lại như sau thì nó không hoạt động (tôi nghĩ điều này tương đương với việc định hình lại ở trên):
subtensorRight = rE[ri,:]
subtensorRight = subtensorRight.reshape(subtensorRight.shape)
Lỗi là:
ValueError: Kích thước đầu vào không khớp (input[0].shape[0] = 2, input[1].shape[0] = 1)
Áp dụng nút gây ra lỗi: Elemwise{Composite{sqr((i0 - i1))}[(0, 0)](AdvancedSubtensor1.0, Reshape{2}.0)
Chỉ số Toposort: 6
Các loại đầu vào: [TensorType(float64, ma trận), TensorType(float64, ma trận)]
Hình dạng đầu vào: [(2, 5), (1, 5)]
Bước tiến đầu vào: [(40, 8), (40, 8)]
Giá trị đầu vào: ['không hiển thị', mảng([[ 0.54193252, 0.36793023, 0.89009085, 0.02487759, 0.95955664]])]
Ứng dụng khách đầu ra: [[Sum{axis=[1], acc_dtype=float64}(Elemwise{Composite{sqr((i0 - i1))}[(0, 0)].0)]]
Câu hỏi: Tại sao chúng tôi nhận được kết quả khác nhau khi định hình lại kích thước 0 từ một subtensor?
Vấn đề là hàm theano của bạn không biết chính xác (ri
) Chỉ mục sẽ chỉ có 1 phần tử (vì vậy, với tất cả những gì bạn biết, bạn sẽ cố gắng trừ ma trận NxD khỏi ma trận MxD, ma trận này thường không hoạt động. Nhưng đối với trường hợp của bạn, bạn chỉ cần N=1.)
Giải pháp là khai báo chỉ mục chính xác của bạn dưới dạng vô hướng.
Tôi tin rằng đoạn mã sau sẽ đáp ứng nhu cầu của bạn:
nhập khẩu theano
nhập numpy dưới dạng np
nhập theano.tensor dưới dạng T
def embedding_matrix(D, N, name):
W_values = np.random.uniform(size=(D, N))
trả về theano.shared(value=W_values, name=name)
rE = embedding_matrix(4, 5, "rE")
lis = T.ivector('lis')# [1,2]
subtensorLeft = rE[lis,:]
ri = T.iscalar('ri') # Thay vì: ri = T.ivector('ri')
subtensorRight = rE[ri,:]
def fnsim(trái, phải):
return - T.sqrt(T.sum(T.sqr(trái - phải), axis=1))
khoảng cách_test = theano.function(
đầu vào=[lis, ri],
đầu ra=fnsim(subtensorLeft, subtensorRight)
)
print distances_test([1,2],1) # Thay vì: distances_test([1,2],[1])
(đầu ra[-0.-1.01565315]
)
Tự quảng cáo một cách không biết xấu hổ:
Bạn có thể sử dụng Platothư viện để tạo mã theano dễ đọc hơn. Trong trường hợp của bạn:
từ biểu tượng nhập khẩu plato.core
nhập numpy dưới dạng np
nhập theano.tensor dưới dạng T
@symbolic
def distances_test(ma trận, test_rows, reference_row):
left = ma trận[test_rows]
đúng = ma trận[reference_row]
return - T.sqrt(T.sum(T.sqr(trái - phải), axis=1))
f = khoảng cách_test.compile()
print f(np.random.uniform(size=(4, 5)), np.array([1,2]), 1)
Tôi là một lập trình viên xuất sắc, rất giỏi!