问题
I've got an error:
InvalidArgumentError (see above for traceback): Incompatible shapes: [12192768] vs. [4064256] [[Node: mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape, Reshape_1)]]
Here is my code:
import numpy as np
import os
from skimage.io import imread, imsave
from keras.models import load_model, Model
from keras.layers import Conv2D, MaxPooling2D, Input, concatenate, Conv2DTranspose
from keras.optimizers import Adam
from keras.callbacks import TensorBoard
from keras import backend as K
K.set_image_dim_ordering('tf')
tbCallBack = TensorBoard(log_dir='./logs',
histogram_freq=1,
write_graph=True,
write_grads=True,
write_images=True)
def dice_coef(y_true, y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.0)
def dice_coef_loss(y_true, y_pred):
return -dice_coef(y_true, y_pred)
def build():
inputs = Input(shape=(1008, 1008, 3))
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)
up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(conv5), conv4], axis=3)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)
up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv6), conv3], axis=3)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)
up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv7), conv2], axis=3)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)
up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(conv8), conv1], axis=3)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)
conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)
model = Model(inputs=[inputs], outputs=[conv10])
model.compile(optimizer=Adam(lr=1e-5), loss=dice_coef_loss, metrics=[dice_coef])
return model
def prepare_train():
files = os.listdir('./raws/')
x_files_names = filter(lambda x: x.endswith('_raw.jpg'), files)
total = len(x_files_names)
x_train = np.ndarray((total, 1008, 1008, 3), dtype=np.uint8)
i = 0
for x_file_name in x_files_names:
img = imread(os.path.join('./raws/' + x_file_name))
x_train[i] = np.array([img])
i += 1
np.save('x_train.npy', x_train)
files = os.listdir('./masks/')
y_files_names = filter(lambda x: x.endswith('_mask.jpg'), files)
total = len(y_files_names)
y_train = np.ndarray((total, 1008, 1008, 3), dtype=np.uint8)
i = 0
for y_file_name in y_files_names:
img = imread(os.path.join('./masks/' + y_file_name))
y_train[i] = np.array([img])
i += 1
np.save('y_train.npy', y_train)
def train():
x_train = np.load('x_train.npy')
x_train = x_train.astype('float32')
x_train /= 255
y_train = np.load('y_train.npy')
y_train = y_train.astype('float32')
y_train /= 255.
model.fit(x_train,
y_train,
batch_size=4,
epochs=25,
callbacks=[tbCallBack])
model.save('model.h5')
def prepare_predict():
files = os.listdir('./predict_raws/')
x_files_names = filter(lambda x: x.endswith('_raw.jpg'), files)
total = len(x_files_names)
x_train = np.ndarray((total, 1008, 1008, 3), dtype=np.uint8)
i = 0
for x_file_name in x_files_names:
img = imread(os.path.join('./predict_raws/' + x_file_name))
x_train[i] = np.array([img])
i += 1
np.save('x_predict.npy', x_train)
def predict():
x_predict = np.load('x_predict.npy')
x_predict = x_predict.astype('float32')
x_predict /= 255
predictions = model.predict_on_batch(x_predict)
np.save('predictions.npy', predictions)
if not os.path.exists('logs'):
os.makedirs('logs')
if not os.path.exists('raws'):
os.makedirs('raws')
if not os.path.exists('masks'):
os.makedirs('masks')
if not os.path.exists('predict_raws'):
os.makedirs('predict_raws')
if not os.path.exists('predict_masks'):
os.makedirs('predict_masks')
zero_choice = raw_input('Prepare training data? (y or n): ')
if zero_choice == 'y':
prepare_train()
frst_choice = raw_input('Please, enter needed action (load or train): ')
if frst_choice == 'load':
model = load_model('model.h5')
elif frst_choice == 'train':
model = build()
train()
scnd_choice = raw_input('Prepare test data? (y or n): ')
if scnd_choice == 'y':
prepare_predict()
thrd_choice = raw_input('Model is ready! Start prediction? (y or n): ')
if thrd_choice == 'y':
predict()
elif thrd_choice == 'n':
exit()
Here is full text of error:
Epoch 1/25
Traceback (most recent call last):
File "segmenting_network.py", line 162, in <module>
train()
File "segmenting_network.py", line 111, in train
callbacks=[tbCallBack])
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1430, in fit
initial_epoch=initial_epoch)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1079, in _fit_loop
outs = f(ins_batch)
File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 2268, in __call__
**self.session_kwargs)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 789, in run
run_metadata_ptr)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 997, in _run
feed_dict_string, options, run_metadata)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1132, in _do_run
target_list, options, run_metadata)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1152, in _do_call
raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12192768] vs. [4064256]
[[Node: gradients/mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _class=["loc:@mul"], _device="/job:localhost/replica:0/task:0/cpu:0"](gradients/mul_grad/Shape, gradients/mul_grad/Shape_1)]]
Caused by op u'gradients/mul_grad/BroadcastGradientArgs', defined at:
File "segmenting_network.py", line 162, in <module>
train()
File "segmenting_network.py", line 111, in train
callbacks=[tbCallBack])
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1413, in fit
self._make_train_function()
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 937, in _make_train_function
self.total_loss)
File "/usr/local/lib/python2.7/dist-packages/keras/optimizers.py", line 404, in get_updates
grads = self.get_gradients(loss, params)
File "/usr/local/lib/python2.7/dist-packages/keras/optimizers.py", line 71, in get_gradients
grads = K.gradients(loss, params)
File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 2305, in gradients
return tf.gradients(loss, variables, colocate_gradients_with_ops=True)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 540, in gradients
grad_scope, op, func_call, lambda: grad_fn(op, *out_grads))
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 346, in _MaybeCompile
return grad_fn() # Exit early
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 540, in <lambda>
grad_scope, op, func_call, lambda: grad_fn(op, *out_grads))
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_grad.py", line 663, in _MulGrad
rx, ry = gen_array_ops._broadcast_gradient_args(sx, sy)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 395, in _broadcast_gradient_args
name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2506, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1269, in __init__
self._traceback = _extract_stack()
...which was originally created as op u'mul', defined at:
File "segmenting_network.py", line 161, in <module>
model = build()
File "segmenting_network.py", line 68, in build
model.compile(optimizer=Adam(lr=1e-5), loss=dice_coef_loss, metrics=[dice_coef])
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 840, in compile
sample_weight, mask)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 446, in weighted
score_array = fn(y_true, y_pred)
File "segmenting_network.py", line 29, in dice_coef_loss
return -dice_coef(y_true, y_pred)
File "segmenting_network.py", line 24, in dice_coef
intersection = K.sum(y_true_f * y_pred_f)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 838, in binary_op_wrapper
return func(x, y, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 1061, in _mul_dispatch
return gen_math_ops._mul(x, y, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 1377, in _mul
result = _op_def_lib.apply_op("Mul", x=x, y=y, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2506, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1269, in __init__
self._traceback = _extract_stack()
InvalidArgumentError (see above for traceback): Incompatible shapes: [12192768] vs. [4064256]
[[Node: gradients/mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _class=["loc:@mul"], _device="/job:localhost/replica:0/task:0/cpu:0"](gradients/mul_grad/Shape, gradients/mul_grad/Shape_1)]]
Versions:
Keras 2.0.6
TF 1.2.1
NP 1.13.1
The only idea, which I had, is to decrease the size of batch, but it does not help. Have anybody some ideas?
For training I'm using 11 images with 1008*1008 size and 3 channels of color.
回答1:
The last layer has a wrong number of channels.
It should be
conv10 = Conv2D(3, (1, 1), activation='sigmoid')(conv9)
来源:https://stackoverflow.com/questions/45490841/keras-tf-error-incompatible-shapes