2016-01-13 30 views
9

Tôi đang cố gắng để thực hiện RBM với tensorflow, đây là mã:thực hiện RBM với tensorflow

rbm.py

""" An rbm implementation for TensorFlow, based closely on the one in Theano """ 
import tensorflow as tf 
import math 
def sample_prob(probs): 
    return tf.nn.relu(
     tf.sign(
      probs - tf.random_uniform(probs.get_shape()))) 
class RBM(object): 
    def __init__(self, name, input_size, output_size): 
     with tf.name_scope("rbm_" + name): 
      self.weights = tf.Variable(
       tf.truncated_normal([input_size, output_size], 
        stddev=1.0/math.sqrt(float(input_size))), name="weights") 
      self.v_bias = tf.Variable(tf.zeros([input_size]), name="v_bias") 
      self.h_bias = tf.Variable(tf.zeros([output_size]), name="h_bias") 

    def propup(self, visible): 
     return tf.nn.sigmoid(tf.matmul(visible, self.weights) + self.h_bias) 

    def propdown(self, hidden): 
     return tf.nn.sigmoid(tf.matmul(hidden, tf.transpose(self.weights)) + self.v_bias) 

    def sample_h_given_v(self, v_sample): 
     return sample_prob(self.propup(v_sample)) 

    def sample_v_given_h(self, h_sample): 
     return sample_prob(self.propdown(h_sample)) 

    def gibbs_hvh(self, h0_sample): 
     v_sample = self.sample_v_given_h(h0_sample) 
     h_sample = self.sample_h_given_v(v_sample) 
     return [v_sample, h_sample] 

    def gibbs_vhv(self, v0_sample): 
     h_sample = self.sample_h_given_v(v0_sample) 
     v_sample = self.sample_v_given_h(h_sample) 
     return [h_sample, v_sample] 

    def cd1(self, visibles, learning_rate=0.1): 
     h_start = self.propup(visibles) 
     v_end = self.propdown(h_start) 
     h_end = self.propup(v_end) 
     w_positive_grad = tf.matmul(tf.transpose(visibles), h_start) 
     w_negative_grad = tf.matmul(tf.transpose(v_end), h_end) 
     update_w = self.weights.assign_add(learning_rate * (w_positive_grad - w_negative_grad)) 
     update_vb = self.v_bias.assign_add(learning_rate * tf.reduce_mean(visibles - v_end, 0)) 
     update_hb = self.h_bias.assign_add(learning_rate * tf.reduce_mean(h_start - h_end, 0)) 
     return [update_w, update_vb, update_hb] 

    def reconstruction_error(self, dataset): 
     err = tf.stop_gradient(dataset - self.gibbs_vhv(dataset)[1]) 
     return tf.reduce_sum(err * err) 

rbm_MNIST_test.py

import tensorflow as tf 
import numpy as np 
import rbm 
import input_data 

def build_model(X, w1, b1, wo, bo): 
    h1 = tf.nn.sigmoid(tf.matmul(X, w1)+b1) 
    model = tf.nn.sigmoid(tf.matmul(h1, wo)+bo) 
    return model 

def init_weight(shape): 
    return tf.Variable(tf.random_normal(shape, mean=0.0, stddev=0.01)) 

def init_bias(dim): 
    return tf.Variable(tf.zeros([dim])) 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels 

X = tf.placeholder("float", [None, 784]) 
Y = tf.placeholder("float", [None, 10]) 

rbm_layer = rbm.RBM("mnist", 784, 500) 

for i in range(10): 
    print "RBM CD: ", i 
    rbm_layer.cd1(trX) 

rbm_w, rbm_vb, rbm_hb = rbm_layer.cd1(trX) 


wo = init_weight([500,10]) 
bo = init_bias(10) 
py_x = build_model(X, rbm_w, rbm_hb, wo, bo) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y)) 
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost) 
predict_op = tf.argmax(py_x, 1) 

sess = tf.Session() 
init = tf.initialize_all_variables() 
sess.run(init) 

for i in range(10): 
    for start, end in zip(range(0, len(trX), 128), range(128, len(trX), 128)): 
     sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]}) 
    print i, np.mean(np.argmax(teY, axis=1) == 
        sess.run(predict_op, feed_dict={X: teX, Y: teY})) 

nhưng ở đây có lỗi:

File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1626, in as_graph_def raise ValueError("GraphDef cannot be larger than 2GB.") ValueError: GraphDef cannot be larger than 2GB.

Ai đó có thể giúp tôi giải quyết này?

Trả lời

12

TensorFlow có giới hạn 2GB trên ảnh chụp GraphDef, bắt nguồn từ giới hạn của việc thực hiện bộ đệm giao thức. Bạn có thể nhanh chóng đạt đến giới hạn đó nếu bạn có các hằng số lớn liên tục trong biểu đồ của mình. Đặc biệt, nếu bạn sử dụng cùng một mảng nhiều lần, TensorFlow sẽ thêm nhiều hằng số liên tục vào biểu đồ của bạn.

Trong trường hợp của bạn, mnist.train.images trả về bởi input_data.read_data_sets là một NumPy mảng điểm nổi với hình dạng (55000, 784), vì vậy nó là khoảng 164 MB. Bạn chuyển mảng đó tới rbm_layer.cd1 và bên trong chức năng đó, mỗi lần bạn sử dụng visibles, một nút TensorFlow Const được tạo từ mảng numpy. Bạn sử dụng visibiles ở 3 vị trí, vì vậy, mọi cuộc gọi đến cd1 đang tăng kích thước biểu đồ khoảng 492 MB, vì vậy bạn dễ dàng vượt quá giới hạn. Giải pháp là để tạo ra một TensorFlow liên tục một lần và qua đó liên tục để các cd1 chức năng như vậy:

trX_constant = tf.constant(trX) 
for i in range(10): 
    print "RBM CD: ", i 
    rbm_layer.cd1(trX_constant) 

BTW, tôi không chắc chắn những gì ý định của bạn là trong vòng lặp ở trên. Lưu ý rằng hàm cd1 chỉ cần thêm các nút assign_add vào biểu đồ và KHÔNG thực sự thực hiện việc gán. Nếu bạn thực sự muốn những người được giao đó xảy ra trong khi bạn luyện tập, bạn nên cân nhắc việc chỉ định những người được giao thông qua các phụ thuộc điều khiển cho nút train_op cuối cùng của bạn.

4

Để thực hiện câu hỏi của @ keveman, tôi nghĩ bạn đang cố thực hiện bước CD-k (Tương phản phân kỳ) bằng cách sử dụng vòng lặp đó.

Nhưng tôi e rằng mã này cho đến nay không phù hợp vì CD-k là chức năng sẽ có vị trí Sự khác biệt tự động trong RBM. Điều đó có nghĩa là costtrain_op không phải là cách chính xác để sử dụng với Gradient Descent trong RBM (đó là do vai trò đặc biệt của CD-k). Nhân tiện, lớp RBM cần được đào tạo từng người một mà không cần lớp được kết nối đầy đủ mà không có trong mã của bạn.

Tôi mới sử dụng lưu lượng và tôi cũng muốn thực hiện. Tôi nghĩ rằng tôi không muốn sử dụng Gradient Descent do tensorflow cung cấp vì tôi cần CD-k để phân biệt đặc biệt. Ước gì tôi có thể tìm ra giải pháp sớm thôi.

Cập nhật: Tôi đã thực hiện việc triển khai này cho cả ngày làm việc. Vì vậy, đây là trạng thái hiện tại. Tôi đã thực hiện một phiên bản đơn giản nhưng nó chỉ nhận được kết quả sai. Vui lòng tham khảo code and result

Tôi chỉ tham chiếu cách tiếp cận cụ thể từ DeepLearnToolbox. Tôi nghĩ rằng các thủ tục mà tôi đang cố gắng thực hiện thông qua tensorflow là ok, nhưng không biết những gì đang xảy ra sai về mã thực tế.

Cập nhật 2: Tôi đã sửa đổi mã và bây giờ tôi đã triển khai rbm đơn giản nhất thông qua lưu lượng. xem liên kết code and result ở trên.

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