2015-11-23 29 views
22

Tôi đang cố gắng để xác định RNNCell của riêng tôi (Echo State Network) trong Tensorflow, theo định nghĩa dưới đây.Làm cách nào để triển khai RNN tùy chỉnh (cụ thể là ESN) trong Tensorflow?

x (t + 1) = tanh (Win * u (t) + W * x (t) + WFB * y (t))

y (t) = Wout * z (t)

z (t) = [x (t), u (t)]

x là trạng thái, u là đầu vào, y là đầu ra. Win, W và Wfb không thể huấn luyện được. Tất cả các trọng số được khởi tạo một cách ngẫu nhiên, nhưng W được sửa đổi như sau:. "Thiết lập một tỷ lệ nhất định các yếu tố của W 0, quy mô W để giữ bán kính quang phổ của nó dưới 1,0

tôi có mã này để tạo ra các phương trình

x = tf.Variable(tf.reshape(tf.zeros([N]), [-1, N]), trainable=False, name="state_vector") 
W = tf.Variable(tf.random_normal([N, N], 0.0, 0.05), trainable=False) 
# TODO: setup W according to the ESN paper 
W_x = tf.matmul(x, W) 

u = tf.placeholder("float", [None, K], name="input_vector") 
W_in = tf.Variable(tf.random_normal([K, N], 0.0, 0.05), trainable=False) 
W_in_u = tf.matmul(u, W_in) 

z = tf.concat(1, [x, u]) 
W_out = tf.Variable(tf.random_normal([K + N, L], 0.0, 0.05)) 
y = tf.matmul(z, W_out) 
W_fb = tf.Variable(tf.random_normal([L, N], 0.0, 0.05), trainable=False) 
W_fb_y = tf.matmul(y, W_fb) 

x_next = tf.tanh(W_in_u + W_x + W_fb_y) 

y_ = tf.placeholder("float", [None, L], name="train_output") 

vấn đề của tôi là hai lần. lần đầu tiên tôi không biết làm thế nào để thực hiện điều này như một lớp cha của RNNCell. thứ hai tôi không biết làm thế nào để tạo ra một W tensor theo đặc điểm kỹ thuật trên.

Bất kỳ sự giúp đỡ về bất kỳ câu hỏi nào được đánh giá cao, có lẽ tôi có thể tìm ra cách để chuẩn bị W, nhưng tôi chắc chắn là địa ngục không hiểu cách thực hiện của riêng tôi RNN là một siêu lớp của RNNCell.

Trả lời

10

Để cung cấp một bản tóm tắt nhanh chóng:

Look trong mã nguồn TensorFlow dưới python/ops/rnn_cell.py quá xem làm thế nào để lớp con RNNCell. Nó thường như sau:

class MyRNNCell(RNNCell): 
    def __init__(...): 

    @property 
    def output_size(self): 
    ... 

    @property 
    def state_size(self): 
    ... 

    def __call__(self, input_, state, name=None): 
    ... your per-step iteration here ... 
Các vấn đề liên quan