1

I'm trying to run the following network with Keras, powered by a TensorFlow backend. It's an adaptation of the "VGG-like" convnet from http://keras.io/examples/:

import os 
import sys
import json
import model_control 
from numpy import loadtxt, asarray
from pandas import read_csv
from scipy.ndimage import imread
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD

Y_train = loadtxt(model_control.y_train_file, delimiter=',', dtype = int)

train_files = os.listdir(model_control.train_img_path)
train_files = ['%s/%s' % (model_control.train_img_path, x) for x in train_files if 'jpg' in x]
X_train = asarray([imread(x) for x in train_files])

X_train.shape #..(8144, 128, 256) (a numpy array of 8144 128x256 greyscale, i.e. single-channel, images)
Y_train.shape #..(8144,) (A 1-d numpy array of integer class labels) 

model = Sequential()

model.add(Convolution2D(32, 5, 5, border_mode='valid', input_shape=(1, 128, 256)))
model.add(Activation('relu'))
model.add(Convolution2D(32, 5, 5))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 5, 5, border_mode='valid'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 5, 5))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

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

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

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(X_train, Y_train, batch_size=32, nb_epoch=1, verbose=1)

This produces the error:

ValueError: Cannot feed value of shape (32, 128, 256) for Tensor u'Placeholder_89:0', which has shape '(?, 1, 128, 256)'

I've checked out the following posts but haven't been able to solve this one yet. Any help would be appreciated, along with an explanation of what's going wrong.

    https://groups.google.com/forum/#!topic/keras-users/Vb7MhSqne0Y http://stackoverflow.com/questions/33974231/tensorflow-error-using-my-own-data

UPDATE

Posted this question to the Keras issue board (https://github.com/fchollet/keras/issues/2092). There are Gist and sample data links that will allow you to re-create the problem.

aaron
  • 6,339
  • 12
  • 54
  • 80

1 Answers1

0

Solved it. In the script, the following line is needed to "reshape" the input array:

X_train = X_train.reshape(X_train.shape[0], 1, 128, 256)

Really, all we're doing here is adding a somewhat redundant channel dimension to make the shape of the array (8144, 1, 128, 256) instead of (8144, 128, 256). If we were using an RGB array this wouldn't be redundant at all, since it would be (8144, 3, 128, 256). Bottom line: my input array was missing the channel dimension, which I thought I could get away with omitting for greyscales. Turns out you still need to explicitly define the shape.

Great package. Once fixed the code should execute as-is.

aaron
  • 6,339
  • 12
  • 54
  • 80