Проблемы с приготовлением сиамских net с Python и керасами - PullRequest
1 голос
/ 06 апреля 2020

Я хочу создать сеть со следующей формой enter image description here

Итак, я написал этот код:

numClasses = 8
epochs = 20
input_shape=(240,240,3)


#Definicion de la arquitectura del modelo
def getBaseNet(input_shape):

    # Tensores para imagenes de entrada
    #left_input = Input(input_shape)
    #right_input = Input(input_shape)

    # Esquema de red (Buscar info de LRN)
    model1 = Sequential()
    model1.add(Conv2D(96, (11, 11), activation='relu', input_shape=input_shape,name='conv1'))
    model1.add(MaxPooling2D((3, 3), strides=(2, 2), name='pool1'))
    #LRN1
    model1.add(Conv2D(384, (5, 5), activation='relu',name='conv2'))
    model1.add(MaxPooling2D((3, 3), strides=(2, 2), name='pool2'))
    #LRN2
    model1.add(Conv2D(384, (3, 3), activation='relu',name='conv3'))
    model1.add(Conv2D(384, (3, 3), activation='relu', name='conv4'))
    model1.add(Conv2D(256, (3, 3), activation='relu', name='conv5'))
    model1.add(MaxPooling2D((2, 2), strides=(2, 2), name='pool3'))
    model1.add(Flatten())
    model1.add(Dense(4096,activation='relu',name='fc1'))


def getSiameseNet(input_shape,numClasses):

    input_a = Input(shape=input_shape)
    input_b = Input(shape=input_shape)

    left=getBaseNet(input_a)
    right=getBaseNet(input_b)

    outLayers=Dense(4096, activation='relu', name='fc2')(left,right)
    outLayers=Dense(4096, activation='relu', name='fc3')(outLayers)
    outLayers=Dense(8, activation='relu', name='fc4')(outLayers)
    outLayers=Dense(numClasses, activation='softmax', name='predictions')(outLayers)

    # Connect the inputs with the outputs
    siamese_net = Model(inputs=[input_a, input_b], outputs=outLayers)

    # return the model
    return siamese_net


model = getSiameseNet(input_shape,numClasses)

model.compile(loss='categorical_crossentropy',
            optimizer='adam',
            metrics=['acc', 'mse'])
model.summary()

Когда я запускаю его, я получаю эта ошибка:

Cannot iterate over a tensor with unknown first dimension.

Я обнаружил, что это потому, что в этой строке:

model1.add(Conv2D(96, (11, 11), activation='relu', input_shape=input_shape,name='conv1'))

Параметр input_shape не прав, поэтому, если я поставлю (240,240,3) вместо заданного ему параметра работает. Я хочу знать, как ее решить.

Итак, если я поставлю (240,240,3), то получу эту ошибку:

OOM when allocating tensor with shape[147456,4096] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:Add] name: fc1_1/random_uniform/

И я понятия не имею, как решить этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...