oarriaga / STN.keras

Implementation of spatial transformer networks (STNs) in keras 2 with tensorflow as backend.
MIT License
278 stars 75 forks source link

Keras 2 and Tensorflow 1 #2

Closed mnill closed 7 years ago

mnill commented 7 years ago

fixes.

hoanghng commented 7 years ago

Nice @mnill,

Does the ipython file need updating accordingly? I tried running the current ipython notebook and got error:

InvalidArgumentError Traceback (most recent call last)

in () 14 print("X_batch size = {}".format(X_batch.shape)) 15 print("y_batch size = {}".format(y_batch.shape)) ---> 16 loss = model.train_on_batch(X_batch, y_batch) 17 #print(loss) 18 #progbar.add(X_batch.shape[0], values=[("train loss", loss)]) /path/to/lib/python2.7/site-packages/keras/models.pyc in train_on_batch(self, x, y, class_weight, sample_weight, **kwargs) 764 return self.model.train_on_batch(x, y, 765 sample_weight=sample_weight, --> 766 class_weight=class_weight) 767 768 def test_on_batch(self, x, y, ... InvalidArgumentError: Matrix size-incompatible: In[0]: [256,1152], In[1]: [6272,256] [[Node: MatMul_6 = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_20, dense_3_W/read)]]
mnill commented 7 years ago

@hoanghng Sorry, I do not use ipython in my job, Please, make sure u are on latest keras\tensorflow.

Also i forgot to comment https://github.com/oarriaga/spatial_transformer_networks/pull/2/commits/9c69d595e5c23c5e390eef7f672fcb538e43730c Added to pull request...

This script works well for me: (borrowed from notebook, only cuts, no changes in code)

import numpy as np
np.random.seed(1337)  # for reproducibility

from scipy.misc import imresize
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.utils import np_utils, generic_utils
from keras.optimizers import Adam, SGD

import keras.backend as K
from spatial_transformer import SpatialTransformer

batch_size = 128
nb_classes = 10
nb_epoch = 12

DIM = 60
mnist_cluttered = "../datasets/mnist_cluttered_60x60_6distortions.npz"

data = np.load(mnist_cluttered)
X_train, y_train = data['x_train'], np.argmax(data['y_train'], axis=-1)
X_valid, y_valid = data['x_valid'], np.argmax(data['y_valid'], axis=-1)
X_test, y_test = data['x_test'], np.argmax(data['y_test'], axis=-1)
# reshape for convolutions
X_train = X_train.reshape((X_train.shape[0], DIM, DIM, 1))
X_valid = X_valid.reshape((X_valid.shape[0], DIM, DIM, 1))
X_test = X_test.reshape((X_test.shape[0], DIM, DIM, 1))

y_train = np_utils.to_categorical(y_train, nb_classes)
y_valid = np_utils.to_categorical(y_valid, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)

print("Train samples: {}".format(X_train.shape))
print("Validation samples: {}".format(X_valid.shape))
print("Test samples: {}".format(X_test.shape))

input_shape =  np.squeeze(X_train.shape[1:])
input_shape = (60,60,1)
print("Input shape:",input_shape)

# initial weights
b = np.zeros((2, 3), dtype='float32')
b[0, 0] = 1
b[1, 1] = 1
W = np.zeros((50, 6), dtype='float32')
weights = [W, b.flatten()]

locnet = Sequential()
locnet.add(MaxPooling2D(pool_size=(2,2), input_shape=input_shape))
locnet.add(Convolution2D(20, 5, 5))
locnet.add(MaxPooling2D(pool_size=(2,2)))
locnet.add(Convolution2D(20, 5, 5))

locnet.add(Flatten())
locnet.add(Dense(50))
locnet.add(Activation('relu'))
locnet.add(Dense(6, weights=weights))
#locnet.add(Activation('sigmoid'))

model = Sequential()

model.add(SpatialTransformer(localization_net=locnet,
                             output_size=(30,30), input_shape=input_shape))

model.add(Convolution2D(32, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')

XX = model.input
YY = model.layers[0].output
F = K.function([XX], [YY])

print(X_train.shape[0]/batch_size)

nb_epochs = 10 # you probably want to go longer than this
batch_size = 256
try:
    for e in range(nb_epochs):
        print('-'*40)
        #progbar = generic_utils.Progbar(X_train.shape[0])
        for b in range(150):
            #print(b)
            f = b * batch_size
            l = (b+1) * batch_size
            X_batch = X_train[f:l].astype('float32')
            y_batch = y_train[f:l].astype('float32')
            loss = model.train_on_batch(X_batch, y_batch)
            print(loss)
            #progbar.add(X_batch.shape[0], values=[("train loss", loss)])
        scorev = model.evaluate(X_valid, y_valid, verbose=1)
        scoret = model.evaluate(X_test, y_test, verbose=1)
        print('Epoch: {0} | Valid: {1} | Test: {2}'.format(e, scorev, scoret))

except KeyboardInterrupt:
    pass
hoanghng commented 7 years ago

Thanks @mnill, it works with Keras 2.0.2 and Tensorflow 1.0 now.