foreach с индексом [дубликат]

Редактировать : Возможно, я неправильно понял ваш вопрос. Если вы намереваетесь иметь 136 выходных узлов, которые можно упорядочить в матрицу 68x2 (, а не иметь изображение 68x68x2 на выходе, как я сначала сказал ), то вы можете использовать Reshape слой после вашего окончательного плотного слоя с 136 единицами:

import keras
from keras.models import Sequential
from keras.layers import Conv2D, Flatten, Dense, Reshape

model = Sequential()
model.add(Conv2D(32, 3, input_shape=(320, 320, 3)))
model.add(Flatten())
model.add(Dense(136))
model.add(Reshape((68, 2)))

model.summary()

Это даст вам следующую модель с желаемой формой на выходе:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_2 (Conv2D)            (None, 318, 318, 32)      896       
_________________________________________________________________
flatten_2 (Flatten)          (None, 3235968)           0         
_________________________________________________________________
dense_2 (Dense)              (None, 136)               440091784 
_________________________________________________________________
reshape_1 (Reshape)          (None, 68, 2)             0         
=================================================================
Total params: 440,092,680
Trainable params: 440,092,680
Non-trainable params: 0

Обязательно проведите обучение этикетки в той же форме при подгонке модели.


(первоначальный ответ, возможно, все еще актуален)

Да, это обычно делается в моделях семантической сегментации, где входные данные являются изображениями, а выходные - тензоры одинаковой высоты и ширины изображения, а также с количеством каналов, равным количеству классов на выходе. Если вы хотите сделать это в TensorFlow или Keras, вы можете посмотреть существующих реализаций , например, архитектуры U-Net.

Основная особенность этих моделей заключается в том, что эти сети являются полностью сверточными: они состоят только из сверточных слоев. Как правило, карты feaure в этих моделях сначала переходят от «широких и неглубоких» (карты больших объектов в пространственных измерениях с небольшим количеством каналов) к «маленьким и глубоким» (небольшие пространственные измерения, измерение больших размеров каналов) и обратно к желаемый выходной размер. Отсюда U-образная форма:

enter image description here

Есть много способов перейти от 320x320x3 до 68x2 с полностью сверточной сетью, но ввод и вывод вашей модели в основном будет выглядеть так:

import keras
from keras import Sequential
from keras.layers import Conv2D

model = Sequential()

model.add(Conv2D(32, 3, activation='relu', input_shape=(320,320,3)))
# Include more convolutional layers, pooling layers, upsampling layers etc
...
# At the end of the model, add your final Conv2dD layer with 2 filters
# and the required activation function
model.add(Conv2D(2, 3, activation='softmax'))

150
задан Blorgbeard 12 July 2016 в 01:18
поделиться

7 ответов

Я имею в наличии этот дополнительный метод для этого:

public static void Each<T>(this IEnumerable<T> ie, Action<T, int> action)
{
    var i = 0;
    foreach (var e in ie) action(e, i++);
}

И использование это как так:

var strings = new List<string>();
strings.Each((str, n) =>
{
    // hooray
});

Или допускать break - как поведение:

public static bool Each<T>(this IEnumerable<T> ie, Func<T, int, bool> action)
{
    int i = 0;
    foreach (T e in ie) if (!action(e, i++)) return false;
    return true;
}

var strings = new List<string>() { "a", "b", "c" };

bool iteratedAll = strings.Each ((str, n)) =>
{
    if (str == "b") return false;
    return true;
});
260
ответ дан 23 November 2019 в 22:18
поделиться

Можно сделать следующий

foreach (var it in someCollection.Select((x, i) => new { Value = x, Index = i }) )
{
   if (it.Index > SomeNumber) //      
}

, Это создаст анонимную стоимость типа для каждой записи в наборе. Это будет иметь два свойства

  • Value: с исходным значением в наборе
  • Index: с индексом в наборе
205
ответ дан 23 November 2019 в 22:18
поделиться

C# foreach не имеет созданного в индексе. Необходимо будет добавить целое число вне цикла foreach и увеличить его каждый раз.

int i = -1;
foreach (Widget w in widgets)
{
   i++;
   // do something
}

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

for (int i = 0; i < widgets.Length; i++)
{
   w = widgets[i];
   // do something
}
59
ответ дан 23 November 2019 в 22:18
поделиться

Кроме LINQ уже отвечает данный, я имею класс "SmartEnumerable" , который позволяет Вам получать индекс и "первое/последнее" - мыс. Это немного ужасно с точки зрения синтаксиса, но можно найти это полезным.

Мы можем, вероятно, улучшить вывод типа с помощью статического метода в неуниверсальном типе, и неявная типизация поможет также.

15
ответ дан 23 November 2019 в 22:18
поделиться

Мое решение включает простой Парный класс, который я создал для общей утилиты, и который является оперативно по существу тем же как классом платформы KeyValuePair. Затем я создал пару дополнительных функций для IEnumerable под названием Ордината (от термина теории множеств" порядковый ").

Эти функции возвратят для каждого объекта Парный объект, содержащий индекс и сам объект.

public static IEnumerable<Pair<Int32, X>> Ordinate<X>(this IEnumerable<X> lhs)
{
    return lhs.Ordinate(0);
}

public static IEnumerable<Pair<Int32, X>> Ordinate<X>(this IEnumerable<X> lhs, Int32 initial)
{
    Int32 index = initial - 1;

    return lhs.Select(x => new Pair<Int32, X>(++index, x));
}
6
ответ дан 23 November 2019 в 22:18
поделиться

Нет, нет.

, Поскольку другие люди показали, существуют способы моделировать поведение Ruby. Но возможно иметь тип, который реализует IEnumerable, который не выставляет индекс.

3
ответ дан 23 November 2019 в 22:18
поделиться

Это зависит от класса, который Вы используете.

Dictionary< (< (TKey, TValue>)>) Класс, Например, Поддержка Это

Dictionary< (< (TKey, TValue>)>), универсальный класс обеспечивает отображение от ряда ключей ко множеству значений.

В целях перечисления, каждый объект в словаре рассматривают как KeyValuePair< (< (TKey, TValue>)>) структура, представляющая значение и его ключ. Порядок, в котором возвращаются объекты, не определен.

foreach (KeyValuePair kvp в myDictionary) {...}

0
ответ дан 23 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: