2015-12-04 47 views
10

Tôi đang cố gắng áp dụng phần chuyên gia của hướng dẫn cho dữ liệu của riêng tôi nhưng tôi tiếp tục gặp phải các lỗi kích thước. Đây là mã dẫn đến lỗi.Làm cách nào để sửa lỗi thứ nguyên trong TensorFlow?

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

W_conv1 = weight_variable([1, 8, 1, 4]) 
b_conv1 = bias_variable([4]) 

x_image = tf.reshape(tf_in, [-1,2,8,1]) 

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

Và sau đó khi tôi cố gắng chạy lệnh này:

W_conv2 = weight_variable([1, 4, 4, 8]) 
b_conv2 = bias_variable([8]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

tôi nhận được các lỗi sau đây:

ValueError        Traceback (most recent call last) 
<ipython-input-41-7ab0d7765f8c> in <module>() 
     3 
     4 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
----> 5 h_pool2 = max_pool_2x2(h_conv2) 

ValueError: ('filter must not be larger than the input: ', 'Filter: [', Dimension(2), 'x', Dimension(2), '] ', 'Input: [', Dimension(1), 'x', Dimension(4), '] ') 

Chỉ cần đối với một số thông tin cơ bản, các dữ liệu mà tôi đang đối phó với một tệp CSV trong đó mỗi hàng chứa 10 tính năng và 1 cột trống có thể là 1 hoặc 0. Tôi đang cố gắng lấy được xác suất trong cột trống mà cột sẽ bằng 1.

+0

'tf_in' là gì? Tôi giả sử nó là đầu vào 1x8 gốc. – erickrf

+0

'data = genfromtxt ('cs-training.csv', delimiter = ',')'. 'A = data.shape [1] -1'. 'tf_in = tf.placeholder (" float ", [None, A])'. – NickTheInventor

Trả lời

4

Bạn phải định hình đầu vào sao cho nó tương thích với cả bộ kéo và đầu ra đào tạo. Nếu bạn nhập là chiều dài 1, đầu ra của bạn nên có chiều dài 1 (chiều dài được thay thế cho kích thước).

Khi bạn đang làm việc với-Thông báo

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 1, 1, 1], 
        strides=[1, 1, 1, 1], padding='SAME') 

làm thế nào tôi đã thay đổi những bước tiến và ksize để [1, 1, 1, 1]. Điều này sẽ phù hợp với đầu ra cho đầu vào 1 chiều và ngăn lỗi xuống đường.

Khi bạn xác định biến cân nặng của bạn (xem mã bên dưới) -

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

bạn sẽ phải làm cho 2 số đầu tiên phù hợp với các tensor tính năng mà bạn đang sử dụng để đào tạo mô hình của bạn , hai số cuối sẽ là kích thước của đầu ra được dự đoán (giống như kích thước của đầu vào).

W_conv1 = weight_variable([1, 10, 1, 1]) 
b_conv1 = bias_variable([1]) 

Thông báo [1, 10, khi bắt đầu có nghĩa là tensor tính năng sẽ trở thành một tính năng 1x10; hai số cuối cùng 1, 1] tương ứng với kích thước của các đầu ra và đầu ra/đầu ra.

Khi bạn định hình lại tensor x_foo của bạn (tôi gọi nó X_ [x Thủ]), bạn, vì lý do gì, phải xác định nó như Somali Thông báo

x_ = tf.reshape(x, [-1,1,10,1]) 

1 và 10 trong trung ...1,10,.... Một lần nữa, những con số này tương ứng với kích thước của tensor tính năng của bạn.

Đối với mọi biến thiên vị, bạn chọn số cuối cùng của biến được xác định trước đó. Ví dụ: nếu W_conv1 = weight_variable([1, 10, 1, 1]) xuất hiện như vậy, bạn lấy số cuối cùng và đặt số đó vào biến thiên vị để nó có thể khớp với kích thước của đầu vào. Điều này được thực hiện như vậy- b_conv1 = bias_variable([1]).

Nếu bạn cần giải thích thêm, vui lòng nhận xét bên dưới.

3

Các thứ nguyên bạn đang sử dụng cho bộ lọc không khớp với đầu ra của lớp ẩn.

Hãy để tôi biết nếu tôi hiểu bạn: đầu vào của bạn bao gồm 8 tính năng và bạn muốn định dạng lại nó thành ma trận 2x4, phải không?

Trọng số bạn đã tạo với weight_variable([1, 8, 1, 4]) mong đợi đầu vào 1x8, trong một kênh và tạo ra đầu ra 1x8 ở 4 kênh (hoặc các đơn vị ẩn). Bộ lọc bạn đang sử dụng sẽ quét đầu vào theo hình vuông 2x2. Tuy nhiên, vì kết quả của trọng số là 1x8, chúng sẽ không khớp.

Bạn nên thay đổi hình dáng đầu vào như

x_image = tf.reshape(tf_in, [-1,2,4,1]) 

Bây giờ, đầu vào của bạn thực sự là 2x4 thay vì 1x8. Sau đó, bạn cần phải thay đổi hình dạng trọng lượng để (2, 4, 1, hidden_units) để đối phó với một đầu ra 2x4. Nó cũng sẽ tạo ra một đầu ra 2x4, và bộ lọc 2x2 bây giờ có thể được áp dụng.

Sau đó, bộ lọc sẽ khớp với đầu ra của trọng số. Cũng lưu ý rằng bạn sẽ phải thay đổi hình dạng của ma trận trọng lượng thứ hai thành weight_variable([2, 4, hidden_units, hidden2_units])

+0

ok vì vậy những gì tôi đã làm là 'W_conv1 = weight_variable ([2, 4, 1, 8])' và 'b_conv1 = bias_variable ([8])'. Sau đó, tôi đã làm điều này 'x_image = tf.reshape (tf_in, [-1,2,4,1])'. Sau đó, tôi nhận được điều này và nhận được một lỗi- 'W_conv2 = weight_variable ([2, 4, 4, 8])', 'b_conv2 = bias_variable ([8])'. Tôi không hiểu ý bạn là gì bởi hidden_units và hidden_units2 ở cuối. Tôi cho rằng tôi có thể ném nhiều như tôi muốn nhưng các hướng dẫn làm cho nó có vẻ như bạn luôn luôn tăng gấp đôi số trước đó. Thậm chí sau đó tôi vẫn nhận được lỗi này — 'ValueError: Kích thước thứ nguyên (8) và Kích thước (4) không tương thích'. – NickTheInventor

+0

Rất tiếc, tôi đã chỉnh sửa câu trả lời của mình để sửa lại. Hình dạng của các trọng số thứ hai phải phù hợp với kích thước của trọng số trước, vì vậy nó là '[2, 4, hidden_units, hidden2_units]'. Đơn vị ẩn là số đơn vị trong mỗi lớp ẩn, nghĩa là kích thước của chúng. Chúng tương ứng với số lượng kênh bạn tạo ra trong một hình ảnh. Kích thước tối ưu là vấn đề phụ thuộc. – erickrf

+0

Tôi không sử dụng hình ảnh. Tôi đang sử dụng một tập tin csv, nơi có 8 tính năng cho mỗi hàng và một hàng được dự đoán hoặc cho một xác suất có một 1 thay vì một 0. Bạn có thể sử dụng thông tin này để làm rõ những gì bạn có nghĩa là? – NickTheInventor

Các vấn đề liên quan