In [2]:
import numpy as np
import keras as ks
from keras.models import Model
from keras.layers import Input, Dense, Lambda, Reshape, Permute
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling3D, MaxPooling2D
from keras.layers.merge import concatenate
import keras.backend as K

from dataset import *


Using TensorFlow backend.

In [3]:
train_data = Dataset("data/gridworld_8x8.npz", mode='train', imsize=8)
test_data = Dataset("data/gridworld_8x8.npz", mode='test', imsize=8)

In [4]:
def VIN_Block(r, k, ch_q):
    conv3 = Conv2D(filters=l_q, 
                   kernel_size=(3, 3), 
                   padding='same',
                   bias=False)

    conv3b = Conv2D(filters=l_q, 
                   kernel_size=(3, 3), 
                   padding='same',
                   bias=False)
    q = conv3(r)

    for _ in range(k):
        #v = Lambda(lambda x: K.max(x, axis=CHANNEL_AXIS, keepdims=True)),
        #           output_shape=(sz,sz,1))(q)
        v = MaxPooling3D(pool_size=(1,1,ch_q))(q)
        rv = concatenate([r, v], axis=3)
        q = conv3b(rv)
    return q

In [5]:
def VIN(sz, ch_i, k, ch_h, ch_q, ch_a):
    map_in = Input(shape=(sz,sz,ch_i))
    s = Input(shape=(1,), dtype='int32')
    #print(s)
    h = Conv2D(filters=ch_h, 
               kernel_size=(3,3), 
               padding='same', 
               activation='relu')(map_in)
    r = Conv2D(filters=1, 
               kernel_size=(3,3), 
               padding='same',
               use_bias=False,
               activation=None,
               )(h)
    conv3 = Conv2D(filters=ch_q, 
                   kernel_size=(3, 3), 
                   padding='same',
                   use_bias=False)

    conv3b = Conv2D(filters=ch_q, 
                   kernel_size=(3, 3), 
                   padding='same',
                   use_bias=False)
    
    q = conv3(r)
    for _ in range(k):
        v = Lambda(lambda x: K.max(x, axis=3, keepdims=True), output_shape=(sz,sz,1))(q)
        rv = concatenate([r, v], axis=3)
        q = conv3b(rv)
    
    #print(q)
    q = Reshape(target_shape=(sz * sz, ch_q))(q)
    #print(q)
    
    def attention(x):
        #x = K.permute_dimensions(x, (1,0,2))
        N = K.shape(x)[0]
        q_out = K.map_fn(lambda i: K.gather(x[i], s[i,0]), K.arange(0,N), dtype='float32')
        return q_out
    print(q)
    q_out = Lambda(attention, output_shape=(ch_q,))(q)
    print(q_out)
    out = Dense(units=ch_a, input_shape=(10,), activation='softmax', use_bias=False)(q_out)
    print(out)
    return Model(inputs=[map_in,s], outputs=out)

model = VIN(8, 2, 10, 150, 10, 8)


Tensor("reshape_1/Reshape:0", shape=(?, 64, 10), dtype=float32)
Tensor("lambda_11/map/TensorArrayStack/TensorArrayGatherV3:0", shape=(?, 10), dtype=float32)
Tensor("dense_1/Softmax:0", shape=(?, 8), dtype=float32)

In [6]:
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

Xtrain = [train_data.images,train_data.s1*8+train_data.s2]
Ytrain = K.get_value(K.one_hot(train_data.labels, 8))
print(np.shape(Xtrain[0]))
print(np.shape(Ytrain))
model.fit(Xtrain, Ytrain, epochs=5, batch_size=32)


(77760, 8, 8, 2)
(77760, 8)
Epoch 1/5
77760/77760 [==============================] - 106s - loss: 0.4399 - acc: 0.8622   
Epoch 2/5
77760/77760 [==============================] - 108s - loss: 0.2087 - acc: 0.9311   
Epoch 3/5
77760/77760 [==============================] - 171s - loss: 0.1286 - acc: 0.9597   
Epoch 4/5
77760/77760 [==============================] - 125s - loss: 0.0814 - acc: 0.9753   
Epoch 5/5
77760/77760 [==============================] - 121s - loss: 0.0670 - acc: 0.9804   
Out[6]:
<keras.callbacks.History at 0x7fb0e6e93ef0>

In [7]:
Xtest = [test_data.images,test_data.s1*8+test_data.s2]
Ytest = K.get_value(K.one_hot(test_data.labels, 8))
model.evaluate(Xtest, Ytest)


12864/12960 [============================>.] - ETA: 0s
Out[7]:
[0.05234911618802774, 0.98510802469135805]

In [8]:
w = K.one_hot([1],20)
x = K.ones_like(w)
print(w)
y = w*x
print(y)
x = K.reshape(x, shape=(1,1,20))
x = K.concatenate([x,2*x], axis=0)
print(x)
print(K.reshape(x,shape=[-1]))

z = K.gather(x, 1)
print(z)
K.get_value(z)
#y=K.sum(w*x)
#print(y)
ten = K.arange(0,2)
print(ten, x)
K.map_fn(lambda s: s[0], (ten, x))

idx = K.stack([K.arange(0,10),K.arange(0,10)], axis=1)
print(idx)
print(K.get_value(idx))


Tensor("one_hot_2:0", shape=(1, 20), dtype=float32)
Tensor("mul_15:0", shape=(1, 20), dtype=float32)
Tensor("concat:0", shape=(2, 1, 20), dtype=float32)
Tensor("Reshape_1:0", shape=(40,), dtype=float32)
Tensor("Gather:0", shape=(1, 20), dtype=float32)
Tensor("arange:0", shape=(2,), dtype=int32) Tensor("concat:0", shape=(2, 1, 20), dtype=float32)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-deece49ffa93> in <module>()
     16 ten = K.arange(0,2)
     17 print(ten, x)
---> 18 K.map_fn(lambda s: s[0], (ten, x))
     19 
     20 idx = K.stack([K.arange(0,10),K.arange(0,10)], axis=1)

/usr/local/lib/python3.5/dist-packages/Keras-2.0.2-py3.5.egg/keras/backend/tensorflow_backend.py in map_fn(fn, elems, name, dtype)
   3356         Tensor with dtype `dtype`.
   3357     """
-> 3358     return tf.map_fn(fn, elems, name=name, dtype=dtype)
   3359 
   3360 

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/functional_ops.py in map_fn(fn, elems, dtype, parallel_iterations, back_prop, swap_memory, infer_shape, name)
    385         parallel_iterations=parallel_iterations,
    386         back_prop=back_prop,
--> 387         swap_memory=swap_memory)
    388     results_flat = [r.stack() for r in r_a]
    389 

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py in while_loop(cond, body, loop_vars, shape_invariants, parallel_iterations, back_prop, swap_memory, name)
   2603     context = WhileContext(parallel_iterations, back_prop, swap_memory, name)
   2604     ops.add_to_collection(ops.GraphKeys.WHILE_CONTEXT, context)
-> 2605     result = context.BuildLoop(cond, body, loop_vars, shape_invariants)
   2606     return result
   2607 

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py in BuildLoop(self, pred, body, loop_vars, shape_invariants)
   2436       self.Enter()
   2437       original_body_result, exit_vars = self._BuildLoop(
-> 2438           pred, body, original_loop_vars, loop_vars, shape_invariants)
   2439     finally:
   2440       self.Exit()

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/control_flow_ops.py in _BuildLoop(self, pred, body, original_loop_vars, loop_vars, shape_invariants)
   2386         structure=original_loop_vars,
   2387         flat_sequence=vars_for_body_with_tensor_arrays)
-> 2388     body_result = body(*packed_vars_for_body)
   2389     if not nest.is_sequence(body_result):
   2390       body_result = [body_result]

/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/functional_ops.py in compute(i, tas)
    376       packed_values = input_pack([elem_ta.read(i) for elem_ta in elems_ta])
    377       packed_fn_values = fn(packed_values)
--> 378       nest.assert_same_structure(dtype or elems, packed_fn_values)
    379       flat_fn_values = output_flatten(packed_fn_values)
    380       tas = [ta.write(i, value) for (ta, value) in zip(tas, flat_fn_values)]

/usr/local/lib/python3.5/dist-packages/tensorflow/python/util/nest.py in assert_same_structure(nest1, nest2)
    135     raise ValueError("The two structures don't have the same number of "
    136                      "elements. First structure: %s, second structure: %s."
--> 137                      % (nest1, nest2))
    138   _recursive_assert_same_structure(nest1, nest2)
    139 

ValueError: The two structures don't have the same number of elements. First structure: (tf.int32, tf.float32), second structure: Tensor("map/while/TensorArrayReadV3:0", shape=(), dtype=int32).

In [11]:
x = np.array([1,2], dtype='float32')
myin = Input(shape=(1,2))
print(myin)
m = Model(myin, myin)
m(Input(tensor=x))


Tensor("input_7:0", shape=(?, 1, 2), dtype=float32)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-cbf840a6bf84> in <module>()
      3 print(myin)
      4 m = Model(myin, myin)
----> 5 m(Input(tensor=x))

/usr/local/lib/python3.5/dist-packages/Keras-2.0.2-py3.5.egg/keras/engine/topology.py in Input(shape, batch_shape, name, dtype, sparse, tensor)
   1394                              name=name, dtype=dtype,
   1395                              sparse=sparse,
-> 1396                              input_tensor=tensor)
   1397     # Return tensor including _keras_shape and _keras_history.
   1398     # Note that in this case train_output and test_output are the same pointer.

/usr/local/lib/python3.5/dist-packages/Keras-2.0.2-py3.5.egg/keras/engine/topology.py in __init__(self, input_shape, batch_size, batch_input_shape, dtype, input_tensor, sparse, name)
   1273             # Attempt automatic input shape inference.
   1274             try:
-> 1275                 batch_input_shape = K.int_shape(input_tensor)
   1276             except TypeError:
   1277                 if not input_shape and not batch_input_shape:

/usr/local/lib/python3.5/dist-packages/Keras-2.0.2-py3.5.egg/keras/backend/tensorflow_backend.py in int_shape(x)
    409     if hasattr(x, '_keras_shape'):
    410         return x._keras_shape
--> 411     shape = x.get_shape()
    412     try:
    413         return tuple([i.__int__() for i in shape])

AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'