Для слоя `Concatenate` требуются входные данные с соответствующими формами, за исключением оси concat.

from keras.layers import Input, Conv3D, MaxPooling3D, concatenate, Conv3DTranspose, BatchNormalization, Dropout,  Lambda
from keras.optimizers import Adam

Форма моего изображения (36 128 128,1). Как изменить форму u7, чтобы я мог выполнять конкатенацию? Как это изменить?

def simple_unet_model(IMG_HEIGHT, IMG_WIDTH, IMG_DEPTH, IMG_CHANNELS, num_classes):
    #Build the model
        inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_DEPTH, IMG_CHANNELS))
        #s = Lambda(lambda x: x / 255)(inputs)   #No need for this if we normalize our inputs beforehand
        s = inputs
        inputs = Input(shape=(36,128,128),name='input')
        #Contraction path
        c1 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(s)
        c1 = Dropout(0.1)(c1)
        c1 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c1)
        p1 = MaxPooling3D((2, 2, 2))(c1)
        
        c2 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p1)
        c2 = Dropout(0.1)(c2)
        c2 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c2)
        p2 = MaxPooling3D((2, 2, 2))(c2)
         
        c3 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p2)
        c3 = Dropout(0.2)(c3)
        c3 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c3)
        p3 = MaxPooling3D((2, 2, 2))(c3)
         
        c4 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p3)
        c4 = Dropout(0.2)(c4)
        c4 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c4)
        p4 = MaxPooling3D(pool_size=(2, 2, 2))(c4)
         
        c5 = Conv3D(256, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p4)
        c5 = Dropout(0.3)(c5)
        c5 = Conv3D(256, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c5)
        
        #Expansive path 
        u6 = Conv3DTranspose(128, (2, 2, 2), strides=(2, 2, 2), padding='same')(c5)
        u6 = concatenate([u6, c4])
        c6 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u6)
        c6 = Dropout(0.2)(c6)
        c6 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c6)
         
        u7 = Conv3DTranspose(64, (2, 2, 2), strides=(2, 2, 2), padding='same')(c6)
        u7 = concatenate([u7, c3])
        c7 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u7)
        c7 = Dropout(0.2)(c7)
        c7 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c7)
         
        u8 = Conv3DTranspose(32, (2, 2, 2), strides=(2, 2, 2), padding='same')(c7)
        u8 = concatenate([u8, c2])
        c8 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u8)
        c8 = Dropout(0.1)(c8)
        c8 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c8)
         
        u9 = Conv3DTranspose(16, (2, 2, 2), strides=(2, 2, 2), padding='same')(c8)
        u9 = concatenate([u9, c1])
        c9 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u9)
        c9 = Dropout(0.1)(c9)
        c9 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c9)
         
        outputs = Conv3D(num_classes, (1, 1, 1), activation='softmax')(c9)
         
        model = Model(inputs=[inputs], outputs=[outputs])
        #compile model outside of this function to make it flexible. 
        model.summary()
        
        return model

Я получаю сообщение об ошибке в строке u7 = concatenate([u7, c3])

Для слоя Concatenate требуются входные данные с соответствующими формами, за исключением оси concat. Получил входные формы: [(Нет, 32, 32, 8, 64), (Нет, 32, 32, 9, 64)] Но если форма моего изображения (64 128 128,1). Она работает правильно. Но если я увеличу глубину с 36 до 64, изображение изменится

Построение модели

epochs = 10
model.fit(
    X_train,y_train,
    validation_data=(X_test,y_test),
    epochs=epochs,
    shuffle=True,
    verbose=2,
    callbacks = callbacks_list)

я получаю сообщение об ошибке ValueError: Вход 0 несовместим с моделью слоя: ожидаемая форма = (Нет, 36, 128, 128, 1), найденная форма = (Нет, 64, 128, 128, 1)

добавлен код импорта

user 23.04.2022 07:45
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать объединить axis=1 и удалить один из двух Input слоев. Вам нужен только один. Вот рабочий пример (хотя я не уверен, какова ваша цель):

from keras.layers import Input, Conv3D, MaxPooling3D, concatenate, Conv3DTranspose, BatchNormalization, Dropout,  Lambda
import tensorflow as tf

def simple_unet_model(IMG_HEIGHT, IMG_WIDTH, IMG_DEPTH, IMG_CHANNELS, num_classes):
    #Build the model
        kernel_initializer = tf.keras.initializers.GlorotNormal()
        inputs = Input((IMG_HEIGHT, IMG_WIDTH, IMG_DEPTH, IMG_CHANNELS), name='input')
        #s = Lambda(lambda x: x / 255)(inputs)   #No need for this if we normalize our inputs beforehand
        s = inputs
        #Contraction path
        c1 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(s)
        c1 = Dropout(0.1)(c1)
        c1 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c1)
        p1 = MaxPooling3D((2, 2, 2))(c1)
        
        c2 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p1)
        c2 = Dropout(0.1)(c2)
        c2 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c2)
        p2 = MaxPooling3D((2, 2, 2))(c2)
         
        c3 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p2)
        c3 = Dropout(0.2)(c3)
        c3 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c3)
        p3 = MaxPooling3D((2, 2, 2))(c3)
         
        c4 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p3)
        c4 = Dropout(0.2)(c4)
        c4 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c4)
        p4 = MaxPooling3D(pool_size=(2, 2, 2))(c4)
         
        c5 = Conv3D(256, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(p4)
        c5 = Dropout(0.3)(c5)
        c5 = Conv3D(256, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c5)
        
        #Expansive path 
        u6 = Conv3DTranspose(128, (2, 2, 2), strides=(2, 2, 2), padding='same')(c5)
        u6 = concatenate([u6, c4])
        c6 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u6)
        c6 = Dropout(0.2)(c6)
        c6 = Conv3D(128, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c6)
         
        u7 = Conv3DTranspose(64, (2, 2, 2), strides=(2, 2, 2), padding='same')(c6)
        u7 = concatenate([u7, c3], axis=1)
        c7 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u7)
        c7 = Dropout(0.2)(c7)
        c7 = Conv3D(64, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c7)
         
        u8 = Conv3DTranspose(32, (2, 2, 2), strides=(2, 2, 2), padding='same')(c7)
        u8 = concatenate([u8, c2], axis=1)
        c8 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u8)
        c8 = Dropout(0.1)(c8)
        c8 = Conv3D(32, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c8)
         
        u9 = Conv3DTranspose(16, (2, 2, 2), strides=(2, 2, 2), padding='same')(c8)
        u9 = concatenate([u9, c1], axis=1)
        c9 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(u9)
        c9 = Dropout(0.1)(c9)
        c9 = Conv3D(16, (3, 3, 3), activation='relu', kernel_initializer=kernel_initializer, padding='same')(c9)
         
        outputs = Conv3D(num_classes, (1, 1, 1), activation='softmax')(c9)
         
        model = tf.keras.Model(inputs=[inputs], outputs=[outputs])
        #compile model outside of this function to make it flexible. 
        model.summary()
        
        return model


simple_unet_model(36,128,128, 1, 5)

Как удалить входной слой

user 23.04.2022 07:58

Большое спасибо. Извините за дубликат слоя. Но когда он его создает. Он показывает ошибку. Вопрос обновлен

user 23.04.2022 08:16

@user, пожалуйста, не задавайте новый вопрос с новыми подробностями после того, как ваша первоначальная проблема была решена. Пожалуйста, закройте эту тему и задайте новый вопрос. Это свободно. Подумайте о других пользователях, которые натыкаются на ту же проблему в заголовке вашего вопроса, а затем не могут понять, в чем заключается исправление, потому что оно смешивается с другими вопросами.

AloneTogether 23.04.2022 08:17

Хорошо, я думаю, вам нужно немного подождать, прежде чем вы сможете снова задать вопрос.. @user Возможно, вы задали много вопросов и потом удалили их? См. meta.stackexchange.com/questions/273741/…. В любом случае, вам просто нужно убедиться, что входная форма вашей модели имеет ту же форму, что и ваши данные.

AloneTogether 23.04.2022 08:21

входная форма такая же. ValueError: логиты и метки должны иметь одинаковую форму ((Нет, 140, 128, 128, 1) и (Нет, 36, 128, 128, 1))

user 23.04.2022 09:25

Параметры модели дают: (Нет, 36, 128, 128, 1) (Нет, 140, 128, 128, 1) / У меня нет идеи изменить его

user 23.04.2022 09:33

после шага u9 форма меняется на 140

user 23.04.2022 09:38

Вам придется перепроектировать свою архитектуру, если вы хотите, чтобы она соответствовала вашим данным.

AloneTogether 23.04.2022 09:42

Вы можете задать новый конкретный вопрос о том, с какой проблемой вы столкнулись, но сначала вы должны попробовать сами.

AloneTogether 23.04.2022 09:44

axis=-1 .но формы конкатенации разные в u7

user 01.05.2022 17:36

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