我在使用keras。当我训练我的网络时,我使用了256*256*9的图像形状,但我没有固定高度和宽度。我的网络是一个全卷积网络。但当我用512*512*9的图像进行测试时,由于形状问题,测试失败了。看起来keras的函数无法更改。我真的不知道如何解决这个问题,以下是错误日志:
Traceback (most recent call last): File "test9.py", line 19, in <module> predict = model.predict(img) File "/home/dingyuyang/.conda/envs/tensorflow/lib/python3.5/site-packages/keras/engine/training. py", line 1147, in predict x, _, _ = self._standardize_user_data(x) File "/home/dingyuyang/.conda/envs/tensorflow/lib/python3.5/site-packages/keras/engine/training. py", line 749, in _standardize_user_data exception_prefix='input') File "/home/dingyuyang/.conda/envs/tensorflow/lib/python3.5/site-packages/keras/engine/training_ utils.py", line 137, in standardize_input_data str(data_shape)) ValueError: Error when checking input: expected input_1 to have shape (256, 256, 9) but got array with shape (512, 512, 9)
这是我的测试代码:
model = load_model("weight9.h5")img = scipy.io.loadmat('./bike_r_6.mat')img = img['imghor'].astype("float32")img = img / 255img = np.transpose(img, (1, 2, 0))img = np.reshape(img,(1,)+img.shape)predict = model.predict(img)print(predict.shape)predict[predict>=0.7]=1predict[predict<0.7]=0predict = np.squeeze(predict)predict = np.transpose(predict, (2, 0, 1))name = '92mask.mat'scipy.io.savemat(name, {'x': predict})
这是我的主网络代码:
def unet(pretrained_weights = None,input_size = (None,None,None)): inputs = Input(input_size) conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs) conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1) pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1).......
输入形状是从main()中填充的:
h, w ,d= org.shapemodel = unet(input_size = (h,w,d))
回答:
这很正常,因为它无法工作。您的模型输入形状应该是256*256*9,但您在预测时输入的是512*512*9。当您在model = unet(input_size = (h,w,d))
中创建模型时,您设置了输入的形状为h,w,d。因此,训练示例在fit中和验证/测试在predict中应遵循相同的形状。
如果您有不同的形状,您应该提供一个策略,比如裁剪或重塑您的模型输入