Closed mnill closed 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)]]
@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
Thanks @mnill, it works with Keras 2.0.2 and Tensorflow 1.0 now.
fixes.