Конкатенация Keras TypeError: __init__() получил несколько значений для аргумента 'axis'

В настоящее время я пытаюсь воссоздать Unet. В части "upconvolution", где необходимо объединить выходы двух слоев, я получил упомянутую ошибку. (TypeError: init() получил несколько значений для аргумента 'axis')

  • Версия Keras: 2.0.6
  • Tensorflow-GPU: 1.2.1

Фрагмент кода:

import gzip
import os

from six.moves import urllib
import tensorflow as tf
import numpy as np

from keras.models import Sequential, Model
from keras.layers import Input, Dropout, Flatten, Concatenate
from keras.layers import Conv2D, MaxPool2D, Conv2DTranspose
from keras.utils import np_utils
import keras.callbacks

# Define model architecture
input1 = Input((X_train.shape[1], X_train.shape[2], 1))

conv1 = Conv2D(64,(3,3), activation='relu', padding='same')(input1)
conv1 = Dropout(0.2)(conv1)
conv1 = Conv2D(64,(3,3), activation='relu', padding='same')(conv1)
pool1 = MaxPool2D(pool_size=(2,2))(conv1)

conv2 = Conv2D(128,(3,3), activation='relu', padding='same')(pool1)
conv2 = Dropout(0.2)(conv2)
conv2 = Conv2D(128,(3,3), activation='relu')(conv2)
pool2 = MaxPool2D(pool_size=(2,2))(conv2)

conv3 = Conv2D(256,(3,3), activation='relu', padding='same')(pool2)
conv3 = Dropout(0.2)(conv3)
conv3 = Conv2D(256,(3,3), activation='relu', padding='same')(conv3)
pool3 = MaxPool2D(pool_size=(2,2))(conv3)

conv4 = Conv2D(512,(3,3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(512,(3,3), activation='relu', padding='same')(conv4)

up5 = Concatenate([Conv2DTranspose(256, (2,2), strides=(2,2),padding='same')(conv4), conv3], axis=3)
conv5 = Conv2D(256,(3,3), activation='relu', padding='same')(up5)
conv5 = Conv2D(256,(3,3), activation='relu', padding='same')(conv5)

Подробное сообщение об ошибке:

Traceback (most recent call last):

File "<ipython-input-48-d61955511ff9>", line 1, in <module>
runfile('C:/Users/.../MNIST_Unet_new.py', wdir='C:/Users/.../Documents/KerasTutorials')

File "C:\ProgramData\Anaconda3\envs\tensorflow-gpu\lib\site-packages\spyder\utils\site\sitecustomize.py", line 688, in runfile
execfile(filename, namespace)

File "C:\ProgramData\Anaconda3\envs\tensorflow-gpu\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/.../MNIST_Unet_new.py", line 107, in <module>
up5 = Concatenate([Conv2DTranspose(256, (2,2), strides=(2,2),padding='same')(conv4), conv3], axis=3)

TypeError: __init__() got multiple values for argument 'axis'

2 ответа

Решение

Я нашел решение, которое, кажется, работает!

Я сделал два изменения в коде.

  1. Вместо того чтобы использовать keras.layers.Concatenate, я использую keras.layers.concatenate
  2. Я "исключил" шаг Conv2dTranspose из конкатенации

Соответствующий фрагмент кода теперь выглядит следующим образом

trans5 = Conv2DTranspose(256, (2,2), strides=(2,2),padding='same')(conv4)
up5 = keras.layers.concatenate([trans5, conv3], axis=3)

Может ли это быть какой-то ошибкой в ​​керасе? Должен ли я сообщить об этой проблеме?

В любом случае, большое спасибо за вашу помощь. Ценить это!

Я также получал ошибку, как это.

up5_0 = Concatenate([UpSampling2D(size=(2, 2))(conv4_0), conv4], axis=3)
TypeError: __init__() got multiple values for argument 'axis'

Я решил это, используя только concatenate вместо Concatenate

up5_0 = concatenate([UpSampling2D(size=(2, 2))(conv4_0), conv4], axis=3)

Конкатенат - это слой кераса, его использование

keras.layers.Concatenate(axis=-1)

Здесь, если вы хотите использовать Concatenate вместо concatenate. Вы должны использовать это так:

up5 = Concatenate(axis=3)([Conv2DTranspose(256, (2,2), strides=(2,2),padding='same')(conv4), conv3])

Надеюсь, вам пригодится!

Другие вопросы по тегам