Lasagne не работает: Библиотеки для глубокого обучения Theano/Lasagne / Хабр

Содержание

Библиотеки для глубокого обучения Theano/Lasagne / Хабр

Привет, Хабр!

Параллельно с публикациями статей открытого курса по машинному обучению мы решили запустить ещё одну серию — о работе с популярными фреймворками для нейронных сетей и глубокого обучения.

Я открою этот цикл статьёй о Theano — библиотеке, которая используется для разработки систем машинного обучения как сама по себе, так и в качестве вычислительного бекэнда для более высокоуровневых библиотек, например, Lasagne, Keras или Blocks.

Theano разрабатывается с 2007 года главным образом группой MILA из Университета Монреаля и названа в честь древнегреческой женщины-философа и математика Феано (предположительно изображена на картинке). Основными принципами являются: интеграция с numpy, прозрачное использование различных вычислительных устройств (главным образом GPU), динамическая генерация оптимизированного С-кода.


Будем придерживаться следующего плана:


  • Предисловие или лирическое отступление о библиотеках для глубокого обучения
  • Введение
    • Установка
    • Настройка
  • Основы
    • Первые шаги
    • Переменные и функции
    • Разделяемые переменные и еще о функциях
    • Отладка
  • Машинное обучение на Theano
    • Логистическая регрессия
    • SVM
    • Нелинейные признаки
  • Lasagne
    • Многослойный перцептрон
  • Заключение

Код с примерами из этого поста можно найти тут.


Предисловие или лирическое отступление о библиотеках для глубокого обучения

В настоящее время разработаны десятки библиотек для работы с нейронными сетями, все они, подчас существенно, различаются в реализации, но можно выявить два основных подхода: императивный и символьный. 1

Давайте посмотрим на примере, чем они различаются. Предположим, что мы хотим вычислить простое выражение

Вот так оно выглядело бы в императивном изложении на языке python:

    a = np.ones(10)
    b = np.ones(10) * 2
    c = b * a
    d = c + 1

Интерпретатор исполняет код построчно, сохраняя результаты в переменных a, b, c и d.
Та же программа в символьной парадигме выглядела бы так:

    A = Variable('A')
    B = Variable('B')
    C = B * A
    D = C + Constant(1)
    # компиляция функции
    f = compile(D)
    # исполнение
    d = f(A=np.ones(10), B=np.ones(10)*2)

Существенное различие заключается в том, что когда мы объявляем D, исполнения не происходит, мы лишь задали граф вычислений, который затем скомпилировали и наконец выполнили.

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

С другой стороны, символьная парадигма накладывает больше ограничений, но вычисления получаются более эффективными, как по памяти, так и по скорости исполнения: на этапе компиляции можно применить ряд оптимизаций, выявить неиспользуемые переменные, выполнить часть вычислений, переиспользуя память и так далее. Отличительная черта символьных программ — отдельные этапы объявления графа, компиляции и выполнения.

Мы останавливаемся на этом так подробно, потому что императивная парадигма знакома большинству программистов, в то время как символьная может показаться непривычной, и Theano, как раз, явный пример символьного фреймворка.

Тем, кому хочется разобраться в этом вопросе подробнее, рекомендую почитать соответствующий раздел документации к MXNet (об этой библиотеке мы еще напишем отдельный пост), но ключевой момент для понимания дальнейшего текста заключается в том, что программируя на Theano, мы пишем на python программу, которую потом скомпилируем и выполним.
Но довольно теории, давайте разбираться с Theano на примерах.


Установка

Для установки нам понадобятся: python версии старше 2.6 или 3.3 (лучше dev-версию), компилятор С++ (g++ для Linux или Windows, clang для MacOS), библиотека примитивов линейной алгебры (например ATLAS, OpenBLAS, Intel MKL), NumPy и SciPy.

Для выполнения вычислений на GPU понадобится CUDA, а ряд операций, встречающихся в нейронных сетях, можно ускорить с помощью сuDNN. Начиная с версии 0.8.0, разработчики Theano рекомендуют использовать libgpuarray, что также даёт возможность использовать несколько GPU.

Когда все зависимости установлены, можно установить Theano через pip:

# последний релиз
pip install Theano
# последняя версия из репозитория
pip install --upgrade https://github. com/Theano/Theano/archive/master.zip

Настройка

Theano можно настроить тремя способами:


  • Выставив атрибуты объекта theano.config в нужное значение
  • Через переменную окружения THEANO_FLAGS
  • Через конфигурационный файл $HOME/.theanorc (или $HOME/.theanorc.txt под Windows)

Я обычно использую примерно такой конфигурационный файл:

[global]
    device = gpu # выбирает устройство, на котором будет выполняться наш код - GPU или CPU
    floatX = float32
    optimizer_including=cudnn
    allow_gc = False # быстрее, но использует больше памяти
    #exception_verbosity=high
    #optimizer = None  # полезно при отладке
    #profile = True
    #profile_memory = True
config.dnn.conv.algo_fwd = time_once # эти две опции зачастую приводят к ускорению свёрток
config.dnn.conv.algo_bwd = time_once
[lib]
Cnmem = 0.95 # позволяет включить CNMeM (https://github.com/NVIDIA/cnmem) - менеджер CUDA-памяти

Подробнее о конфигурации можно узнать в документации.


Основы


Первые шаги

Теперь, когда всё установлено и настроено, давайте попробуем написать немного кода, например, вычислим значение многочлена в точке 10:

import theano 
import theano.tensor as T
# объявим theano-переменную
a = T.lscalar()
# определим выражение
expression = 1 + 2 * a + a ** 2
# скомпилируем theano-функцию
f = theano.function(
    inputs=[a],        # аргументы
    outputs=expression  # результат
)
# запустим вычисление
f(10)
>>> array(121)

Здесь мы совершили 4 вещи: определили скалярную переменную а типа long, создали выражение, содержащее наш многочлен, определили и скомпилировали функцию f, а также выполнили её, передав на вход число 10.

Обратим внимание на тот факт, что переменные в Theano — типизированные, причем тип переменной содержит информацию как о типе данных, так и о их размерности, т.е. чтобы посчитать наш многочлен сразу в нескольких точках, потребуется определить а как вектор:

a = T. lvector()
expression = 1 + 2 * a + a ** 2
f = theano.function(
    inputs=[a],
    outputs=expression
)
arg = arange(-10, 10)
res = f(arg)
plot(arg, res, c='m', linewidth=3.)

В данном случае нам нужно только указать количество измерений переменной при инициализации: размер каждого измерения вычисляется автоматически на этапе вызова функции.

UPD: Не секрет, что аппарат линейной алгебры повсеместно используется в машинном обучении: примеры описываются векторами признаков, параметры модели записывают в виде матриц, изображения представляют в виде 3х-мерных тензоров. Скалярные величины, векторы и матрицы можно рассматривать как частный случай тензоров, поэтому именно так мы в дальнейшем будем называть эти объекты линейной алгебры. Под тензором будем понимать N-мерные массивы чисел.
Пакет theano.tensor содержит наиболее часто употребляемые типы тензоров, однако, нетрудно определить и свой тип.

При несовпадении типов Theano выбросит исключение. Исправить это, кстати как и поменять многое другое в работе функций, можно, передав конструктору аргумент allow_input_downcast=True

:

x = T.dmatrix('x')
v = T.fvector('v')
z = v + x
f = theano.function(
    inputs=[x, v],
    outputs=z,
    allow_input_downcast=True
)
f_fail = theano.function(
    inputs=[x, v],
    outputs=z
)
print(f(ones((3, 4), dtype=float64), ones((4,), dtype=float64))
>>> [[ 2.  2.  2.  2.]
>>>  [ 2.  2.  2.  2.]
>>>  [ 2.  2.  2.  2.]]
print(f_fail(ones((3, 4), dtype=float64), ones((4,), dtype=float64))
>>> ---------------------------------------------------------------------------
>>> TypeError                                 Traceback (most recent call last)

Мы также можем вычислять несколько выражений сразу, оптимизатор в этом случае может переиспользовать пересекающиеся части, в данном случае сумму :

x = T.lscalar('x')
y = T.lscalar('y')
square = T.square(x + y)
sqrt = T.sqrt(x + y)
f = theano. function(
    inputs=[x, y],
    outputs=[square, sqrt]
)
print(f(5, 4))
>>> [array(81), array(3.0)]
print(f(2, 2))
>>> [array(16), array(2.0)]

Для обмена состояниями между функциями используются специальные shared переменные:

state = theano.shared(0)
i = T.iscalar('i')
inc = theano.function([i],
                      state,
                      # обновим разделяемую переменную
                      updates=[(state, state+i)])
dec = theano.function([i],
                      state,
                      updates=[(state, state-i)])
# разделяемые переменные могут менять значения сразу нескольких функций
print(state.get_value())
inc(1)
inc(1)
inc(1)
print(state.get_value())
dec(2)
print(state.get_value())
>>> 0
>>> 3
>>> 1

Значения таких переменных, в отличие от тензорных, можно получать и модифицировать вне Theano-функций из обычного python-кода:

state.set_value(-15)
print(state.get_value())
>>> -15

Значения в shared переменных можно «подставлять» в тензорные переменные:

x = T. lscalar('x')
y = T.lscalar('y')
i = T.lscalar('i')
expression = (x - y) ** 2
state = theano.shared(0)
f = theano.function(
    inputs=[x, i],
    outputs=expression,
    updates=[(state, state+i)],
    # подставим значение переменной state в граф вместо y
    givens={
        y : state
    }
)
print(f(5, 1))
>>> 25
print(f(2, 1))
>>> 1

Отладка

Theano предоставляет ряд средств для отображения графа вычислений и отладки. Тем не менее, отладка символьных выражений по-прежнему остаётся задачей не из лёгких. Мы кратко перечислим тут наиболее употребимые подходы, подробнее об отладке можно прочитать в документации: http://deeplearning.net/software/theano/tutorial/printing_drawing.html

Мы можем распечатать граф вычислений для каждой функции:

x = T.lscalar('x')
y = T.lscalar('y')
square = T.square(x + y)
sqrt = T.sqrt(x + y)
f = theano.function(
    inputs=[x, y],
    outputs=[square, sqrt]
)
# сумма будет подсчитана только один раз
theano.printing.
debugprint(f)

Заметьте, что сумма вычисляется только один раз:

Elemwise{Sqr}[(0, 0)] [id A] ''   2
 |Elemwise{add,no_inplace} [id B] ''   0
   |x [id C]
   |y [id D]
Elemwise{sqrt,no_inplace} [id E] ''   1
 |Elemwise{add,no_inplace} [id B] ''   0

Выражения можно выводить и в более лаконичной форме:

# определим выражение
W = T.fmatrix('W')
b = T.fvector('b')
X = T.fmatrix('X')
expr = T.dot(X, W) + b
prob = 1 / (1 + T.exp(-expr))
pred = prob > 0.5
# и распечатаем его
theano.pprint(pred)
>>> 'gt((TensorConstant{1} / (TensorConstant{1} + exp((-((X \\dot W) + b))))), TensorConstant{0.5})'

Или в виде графа:

theano.printing.pydotprint(pred, outfile='pics/pred_graph.png', var_with_name_simple=True)


К сожалению, читаемость таких графов резко падает с ростом сложности выражения. Фактически что-то понять можно только на игрушечных примерах.


Машинное обучение на Theano


Логистическая регрессия

Давайте посмотрим на примере логистической регрессии, как с помощью Theano можно разрабатывать алгоритмы машинного обучения. Намеренно не будем вдаваться в подробности того, как устроена эта модель (оставим это до соответствующей статьи открытого курса), но напомним, что апостериорная вероятность класса имеет вид

Давайте определим параметры модели, для удобства введём отдельный параметр для смещения:

W = theano.shared(
    value=numpy.zeros((2, 1),dtype=theano.config.floatX),
    name='W')
b = theano.shared(
    value=numpy.zeros((1,), dtype=theano.config.floatX),
    name='b')

И заведём символьные переменные для признаков и меток класса:

X = T.matrix('X')
Y = T.imatrix('Y')

Давайте теперь определим выражения для апостериорной вероятности и предсказаний модели:

linear = T.dot(X, W) + b
p_y_given_x = T.nnet.sigmoid(linear)
y_pred = p_y_given_x > 0.5

И определим функцию потерь вида:

loss = T.nnet.binary_crossentropy(p_y_given_x, Y).mean()

Мы не стали выписывать выражения для сигмоиды и кросс-энтропии в явном виде, а воспользовались функциями из пакета theano. tensor.nnet, который предоставляет оптимизированные реализации ряда популярных в машинном обучении функций. Кроме того, функции из этого пакета обычно включают в себя дополнительные трюки для численной устойчивости.

Для оптимизации функции потерь давайте воспользуемся методом градиентного спуска, каждый шаг которого задаётся выражением:

Давайте воплотим его в коде:

g_W = T.grad(loss, W)
g_b = T.grad(loss, b)
updates = [(W, W - 0.04 * g_W),
           (b, b - 0.08 * g_b)]

Здесь мы воспользовались замечательной возможностью Theano — автоматическим2 дифференцированием. Вызов T.grad вернул нам выражение, которое будет содержать градиент первого аргумента по второму. Это может показаться излишним для столь простого случая, но очень выручает при построении больших, многослойных моделей.

Когда градиенты получены, нам остаётся лишь скомпилировать Theano-функции:

train = theano.function(
    inputs=[X, Y],
    outputs=loss,
    updates=updates,
    allow_input_downcast=True
)
predict_proba = theano. function(
    [X],
    p_y_given_x,
    allow_input_downcast=True
)

И запустить итеративный процесс:

sgd_weights = [W.get_value().flatten()]
for iter_ in range(4001):
    loss = train(x, y[:, np.newaxis])
    sgd_weights.append(W.get_value().flatten())
    if iter_ % 100 == 0:
        print("[Iteration {:04d}] Train loss: {:.4f}".format(iter_, float(loss)))

Для сгенерированных мною данных процесс сходится к такой разделяющей прямой:

Выглядит неплохо, но кажется, что для такой простой задачи 4000 итераций — это как-то многовато… Давайте попробуем ускорить оптимизацию и воспользуемся методом Ньютона. Этот метод использует вторые производные функции потерь и представляет собой последовательность таких шагов:

где — матрица Гессе.

Чтобы посчитать матрицу Гессе, создадим одномерные версии параметров нашей модели:

W_init = numpy.zeros((2,),dtype=theano.config.floatX)
W_flat = theano.shared(W_init, name='W')
W = W_flat.reshape((2, 1))
b_init = numpy. zeros((1,), dtype=theano.config.floatX)
b_flat = theano.shared(b_init, name='b')
b = b_flat.reshape((1,))

И определим шаг оптимизатора:

h_W = T.nlinalg.matrix_inverse(theano.gradient.hessian(loss, wrt=W_flat))
h_b = T.nlinalg.matrix_inverse(theano.gradient.hessian(loss, wrt=b_flat))
updates_newton = [(W_flat, W_flat -  T.dot(h_W , g_W)),
           (b_flat, b_flat - T.dot(h_b, g_b))]

Хоть мы и пришли к тем же результатам,
,
Методу Ньютона для этого понадобилось всего 30 (против 4000 у градиентного спуска) шагов.

Пути обоих методов можно посмотреть на этом графике:


SVC

Так же мы без труда можем реализовать метод опорных векторов, для этого достаточно представить функцию потерь в следующем виде:

В терминах Theano это можно написать с помощью замены нескольких строк в предыдущем примере:

C = 10.
loss = C * T.maximum(0, 1 - linear * (Y * 2 - 1)).mean() + T.square(W).sum()
predict = theano.function(
    [X],
    linear > 0,
    allow_input_downcast=True
)

это гиперпараметр, регуляризующий модель, а выражение просто переводит метки в диапазон

Для выбранного С классификатор разделит пространство так:


Нелинейные признаки

Циклы являются одной из наиболее употребимых конструкций в программировании. Поддержка циклов в Theano представлена функцией scan. Давайте познакомимся с тем, как она работает. Думаю, читателям уже очевидно, что линейная функция от признаков — не лучший кандидат на разделение сгенерированных данных. Этот недостаток можно исправить, добавив полиномиальные признаки к исходным (этот приём подробно описан в другой статье нашего блога). Итак, хочется получить преобразование вида . В python мы могли бы реализовать его, например, так:

poly = []
for i in range(K):
   poly.extend([x**i for x in features])

В Theano это выглядит следующим образом:

def poly(x, degree=2):
    result, updates = theano.scan(
                                  # записываем выражение, вычисляющее каждую новую степень полинома
                                  fn=lambda prior_result, x: prior_result * x,
                                  # инициализируем выходной тензор
                                  outputs_info=T.ones_like(x),
                                  # укажем, что x надо передать в качестве второго аргумента fn
                                  non_sequences=x,
                                  # количество итераций
                                  n_steps=degree)
    # результат возвращаем в виде матрицы N x M*degree
    return result. dimshuffle(1, 0, 2).reshape((result.shape[1], 
                                               result.shape[0] * result.shape[2]))

Первой в scan передается функция, которая будет вызываться на каждой итерации, её первый аргумент — результат на предыдущей итерации, последующие — все non_sequences; outputs_info инициализирует выходной тензор такой же размерности и типа, как и x, и заполняет его единицами; n_steps указывает на требуемое количество итераций.

scan вернет результат в виде тензора размера (n_steps, ) + outputs_info.shape, поэтому мы преобразуем его в матрицу, чтобы получить нужные признаки.

Проиллюстрируем работу полученного выражения простым примером:

[[1, 2],   ->  [[ 1,  2,  1,  4],
 [3, 4],   ->   [ 3,  4,  9, 16],
 [5, 6]]   ->   [ 5,  6, 25, 36]]

Чтобы воспользоваться плодами своих усилий, достаточно поменять определение модели и добавить параметров (ведь признаков стало больше):

W = theano. shared(
    value=numpy.zeros((8, 1),dtype=theano.config.floatX), 
    name='W')
linear = T.dot(poly(X, degree=4), W) + b

Новые признаки позволяют значительно лучше разделить классы:


Нейронные сети и Lasagne

3

К этому моменту мы уже обсудили основные этапы создания систем машинного обучения на Theano: инициализация входных переменных, определение модели, компиляция Theano-функций, цикл с шагами оптимизатора. На этом можно было бы и закончить, но очень уж хочется познакомить читателей с Lasagne — замечательной библиотекой для нейронных сетей, работающей поверх Theano. Lasagne предоставляет набор готовых компонентов: слоёв, алгоритмов оптимизации, функций потерь, инициализаций параметров и т.д., при этом не скрывает Theano за многочисленными слоями абстракций.

Рассмотрим, как может выглядеть типичный код на Theano/Lasagne на примере классификации MNIST’a.


Примеры изображений из MNIST, если вы их еще не видели

Сконструируем многослойный перцептрон с двумя скрытыми слоями по 800 нейронов, для регуляризации будем использовать dropout и разместим этот код в отдельной функции:

def build_mlp(input_var=None):
    # Входной слой, определяющий размерность данных
    # (переменный размер minibatch'a, 1 канал, 28 строк и 28 столбов) 
    # Мы можем передать тензорную переменную для входных данных,
    # или же она будет создана для нас
    network = lasagne. layers.InputLayer(
        shape=(None, 1, 28, 28),
        input_var=input_var)
    #   dropout на 20% для входных данных
    network = lasagne.layers.DropoutLayer(network, p=0.2)
    # Полносвязный слой на 800 нейронов и ReLU в качестве нелинейности
    # также инициализируем веса методом, предложенным Xavier Glorot и Yoshua Bengio
    network = lasagne.layers.DenseLayer(
        network, 
        num_units=800,
        nonlinearity=lasagne.nonlinearities.rectify,
        W=lasagne.init.GlorotUniform())
    # Добавим dropout еще на 50%:
    network = lasagne.layers.DropoutLayer(network, p=0.5)
    # И ещё один полносвязный слой
    network = lasagne.layers.DenseLayer(
        network,
        num_units=800,
        nonlinearity=lasagne.nonlinearities.rectify)
    network = lasagne.layers.DropoutLayer(network, p=0.5)
    # Наконец, добавим классификатор на 10 классов:
    network = lasagne.layers.DenseLayer(
        network,
        num_units=10,
        nonlinearity=lasagne.nonlinearities. softmax)
    return network

Получим вот такую простую полносвязную сеть:



Инициализируем тензорные переменные и скомпилируем Theano-функции для обучения и валидации:

input_var = T.tensor4('inputs')
target_var = T.ivector('targets')
# воспользуемся функцией из предыдущего листинга
network = build_mlp(input_var)
# эта функция вернёт нам граф вычислений, соответствующий сети
prediction = lasagne.layers.get_output(network)
# зададим функцию потерь
loss = lasagne.objectives.categorical_crossentropy(prediction, target_var).mean()
# Сюда также можно добавить L1 или L2 регуляризацию, см. lasagne.regularization.
# Этот метод позволит получить список параметров сети
# он также принимает keyword аргумент, позволяющий выбрать параметры по тегу
# наиболее часто употребимые это trainable и regularizable
params = lasagne.layers.get_all_params(network, trainable=True)
# используем метод стохастического градиентного спуска с моментом Нестерова
updates = lasagne.updates. nesterov_momentum(
    loss, 
    params, 
    learning_rate=0.01, 
    momentum=0.9)
# Также создадим выражение для функции потерь на валидации. 
# Главное отличие тут заключается в аргументе deterministic=True,
# который отключает dropout
test_prediction = lasagne.layers.get_output(network, deterministic=True)
test_loss = T.nnet.categorical_crossentropy(test_prediction,
                                                        target_var).mean()
# Заодно посчитаем точность классификатора
test_acc = T.mean(
    T.eq(T.argmax(test_prediction, axis=1), target_var),
    dtype=theano.config.floatX)
# скомпилируем функцию для обучения
train = theano.function(
    inputs=[input_var, target_var],
    outputs=loss,
    updates=updates)
# и вторую — для валидации
# оптимизатор Theano тут поймёт, что для вычисления функции потерь и точности
# можно переиспользовать большую часть графа
validate = theano.function(
    inputs=[input_var, target_var],
    outputs=[test_loss, test_acc])

Теперь создадим цикл обучения:

print("| Epoch | Train err | Validation err | Accuracy |  Time  |")
print("|------------------------------------------------------------------------|")
try:
    for epoch in range(100):
            # Каждую эпоху будем проходить по всей обучающей выборке
            train_err = 0
            train_batches = 0
            start_time = time. time()
            for batch in iterate_minibatches(X_train, y_train, 500, shuffle=True):
                inputs, targets = batch
                train_err += train(inputs, targets)
                train_batches += 1
            # И по всей валидационной
            val_err = 0
            val_acc = 0
            val_batches = 0
            for batch in iterate_minibatches(X_val, y_val, 500, shuffle=False):
                inputs, targets = batch
                err, acc = validate(inputs, targets)
                val_err += err
                val_acc += acc
                val_batches += 1
            print("|{:05d} | {:4.5f} | {:16.5f} | {:10.2f} | {:7.2f} |".format
                  (epoch,
                    train_err / train_batches,
                    val_err / val_batches,
                    val_acc / val_batches * 100,
                    time.time() - start_time))
except KeyboardInterrupt:
    print("The training was interrupted on epoch: {}".format(epoch))

Получившиеся кривые обучения:



Нашей модели удаётся достичь точности более 98 %, что, несомненно, можно улучшить, используя, например, свёрточные нейронные сети, но эта тема уже выходит за рамки данной статьи.

Сохранять и загружать веса удобно с помощью хелперов:

# Сохраняем веса
savez('model.npz', *lasagne.layers.get_all_param_values(network))
network = build_mlp()
# И загружаем, когда потребуется:
with np.load('model.npz') as f:
     param_values = [f['arr_%d' % i] for i in range(len(f.files))]
lasagne.layers.set_all_param_values(network, param_values)

Документация к Lasagne доступна тут, масса примеров и предобученные модели находятся в отдельном репозитории.


Заключение

В этом посте мы довольно поверхностно ознакомились с возможностями Theano, узнать больше можно:


  • обратившись к документации: 1, 2
  • посмотрев примеры кода
  • пообщавшись с сообществом
  • заглянув в исходный код.

Большая благодарность bauchgefuehl за помощь в подготовке поста.




1. Граница между двумя подходами довольно размыта, и не всё сказанное ниже строго верно, всегда есть исключения и пограничные случаи. Наша задача тут — передать основную идею.
2. Разработчики Theano в техническом отчёте и документации называют дифференцирование символьным. Однако, использование этого термина в одной из предыдущих статей на Хабр вызвало обсуждение. Исходя из исходного кода Theano и определения на Википедии, автор считает, что правильный термин всё же «автоматическое дифференцирование».
3. Материал этого раздела по большей части основан на документации к Lasagne.

Лазанья от моей свекрови / Lasagna della mia suocera

Лазанья — самое любимое блюдо в нашей семье, без него не обходится ни один праздник. Каждое Рождество, Пасху и дни рождения мы готовим это прекрасное блюдо! У любой итальянки есть свой коронный рецепт лазаньи, и Микелина не исключение. Самое главное — всегда ешьте это блюдо только горячим!

Вам понадобится: 

  • 500 мл соуса бешамель
  • 1 л мясного рагу
  • 250 г сыра моцарелла
  • 200 г просеянной муки из мягких сортов пшеницы (farina di grano tenero tipo «00»)
  • 2 куриных яйца
  • соль

Для 1 литра готового рагу:

  • вода
  • 1,5 л пассаты из помидоров
  • 100 г сыроваяленной панчетты
  • 250 г свежеприготовленного свиного фарша
  • 250 г свежеприготовленного говяжьего фарша
  • 1 маленькая луковица
  • 2 веточки базилика
  • оливковое масло холодного отжима
  • свежемолотый черный перец
  • соль

Вам также понадобится: 

 

  • сковорода
  • кастрюля
  • прямоугольная форма 40×25 см
  • кастрюля
  • доска и машинка для замеса и раскатывания теста

Кол-во порций: 

Приготовьте рагу.

В отдельной сковороде на оливковом масле обжарьте весь фарш до золотистого цвета, постоянно помешивая. Уберите сковороду с огня.

Лук почистите и мелко порубите. В кастрюле разогрейте оливковое масло и обжарьте нарезанную мелкими кубиками панчетту до золотистого цвета. Добавьте лук и спассеруйте его на медленном огне. Добавьте обжаренный фарш, влейте пассату, два половника воды и тушите под закрытой крышкой в течение 2-3 часов.

На середине готовности посолите, поперчите и добавьте базилик.

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

Кастрюлю с готовым соусом уберите с огня и оставьте под крышкой при комнатной температуре на 1 час.

 

————

На стол просейте горкой муку, сделайте в центре углубление, добавьте в него яйца и соль и энергично замесите тесто.

Для этого аккуратно взбивайте рукой яйца и понемногу подсыпайте с краев муку. Тесто должно получиться однородным, мягким и эластичным.

Сформуйте из теста шар, оберните его пищевой пленкой и поместите в холодильник на 30 минут. Охлажденное тесто скатайте в жгут толщиной около 8 см и нарежьте на 5-6 одинаковых кусочков. Для раскатывания теста воспользуйтесь машинкой для приготовления пасты — это и удобно, и практично, поскольку листы должны получиться очень тонкими, а добиться такого результата, используя скалку, очень сложно.

Для этого установите машинку на максимальную толщину теста и с ее помощью раскатайте заготовки для теста. Края каждого раскатанного листа загните к центру, снова раскатайте, сложите и повторите 6-7 раз. Тесто должно стать однородным и не быть шероховатым на ощупь. Затем установите машинку на минимальную толщину теста и раскатайте подготовленные листы еще раз.

Имейте в виду, что для лазаньи тесто нужно раскатать тонко, но при этом оно ни в коем случае не должно рваться. Обрежьте ножом края листов, чтобы получились ровные прямоугольники, и отварите их в кипящей подсоленной воде 2 минуты.

 

Разогрейте духовку до 190°С.

«Соберите» лазанью. Моцареллу достаньте из рассола, отожмите руками и нарежьте небольшими кусочками.

Рагу тщательно перемешайте с соусом бешамель и распределите небольшую часть смеси по дну формы. Сверху выложите в один слой листы лазаньи, смажьте их соусом и распределите сверху кусочки моцареллы. Накройте листами лазаньи и повторите процесс так, чтобы верхний слой получился из моцареллы.

Несколько раз наколите тесто вилкой. Накройте лазанью фольгой, чтобы она не пригорала, и поставьте в предварительно разогретую духовку. На приготовление лазаньи обычно уходит около 50 минут. За 15 минут до готовности снимите с нее фольгу и увеличьте температуру духовки до 220°С.

Готовую лазанью разрежьте на порционные куски, разложите по тарелкам и сразу подавайте.

Как предотвратить и исправить водянистую лазанью – SharePostt

Ваша лазанья оказалась слишком водянистой?

Вы не одиноки.

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

Мы также обсудим, как правильно выкладывать слои лазаньи. А советы по выпечке предотвратят водянистую лазанью!

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

1. Выбирайте нежирный говяжий фарш

Более жирный говяжий фарш дешевле нежирного.

Но дополнительное содержание жира может вызвать влажность.

Не забудьте слить лишнюю жидкость перед тем, как переложить мясную начинку в форму для запекания.

2. Точное измерение ингредиентов

Выпечка – это больше наука, чем искусство.

Выбирать ингредиенты на глаз — не лучшая практика для выпечки!

Кроме того, не вносите изменения или замены в рецепт, которые могут добавить влаги и привести к жидкой лазанье.

Например:

  • Нарезая ингредиенты вместо того, чтобы терпеть их , если рецепт требует терпеть
  • Шаги пропуски , как не дренирование избытка жидкости
  • . Овощи

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

    Разморозить и слить воду, чтобы избавиться от лишней воды означает, что вы не получите водянистую лазанью.

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

    4. Предварительно приготовьте овощи

    Предварительно приготовленные овощи уменьшают количество влаги. Не забудьте посолить овощи перед приготовлением, чтобы удалить лишнюю влагу.

    Приготовьте (частично приготовьте) овощи с мясной начинкой. И обязательно слейте лишнюю жидкость с начинки перед сборкой лазаньи.

    Цуккини — овощ, особенно богатый водой, обжарьте его на сковороде, прежде чем выкладывать слоями в форму для лазаньи.

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

    Лазанья Совет: Используйте свежие овощи, они содержат меньше воды, чем замороженные.

    5. Используйте термометр для духовки

    Предварительно нагрейте духовку и проверьте температуру выпечки с помощью термометра для духовки (не доверяйте своему циферблату).

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

    6. Используйте стеклянную посуду для запекания

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

    10 лучших форм для лазаньи

    Какая форма лучше всего подходит для лазаньи?

    Используйте форму для выпечки лазаньи размером 9×13 дюймов.

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

    Стеклянная форма для лазаньи лучше распределяет тепло и дольше остается теплой на вашем столе.

    Тоже отлично выглядит. Высококачественные керамические и металлические сковороды также являются отличным выбором.

    Вот 10 лучших сковородок лазанья в каждой категории:

    Лучший Продукт
    Лучший в целом
    BEST
    .0150 Wilton Non-Stick Lasagna and Roasting Pan
    Best Ceramic Emile Henry HR Modern Classics Large Rectangular Baker
    Best Cast Iron Le Creuset Enameled Cast Iron Signature Roaster
    Best Stainless Steel Полностью облицованный противень для лазаньи
    Best Square Фарфоровая квадратная форма для выпечки лазаньи повышенной прочности
    Best Mirror Finish Cuisinart 7117-14RR Решетка для лазаньи с 9 решетками из нержавеющей стали0150
    Best Oven To Table Stoneware Oven to Table Lasagna Dish Set
    Best Disposable Plasticpro Disposable 9 x 13 Aluminum Foil Pan
    Best Double Handled All-Clad E64 Stainless Steel Lasagna Double Противень с ручкой

    Качественный противень для лазаньи нужен каждому!

    7. Не переполняйте форму для запекания

    Лишняя мясная начинка может привести к жидкой лазанье из-за лишнего сока.

    Придерживайтесь количества мясной начинки, предусмотренного вашим рецептом.

    8. Не накладывайте слой лазаньи 

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

    Как выкладывать слои лазаньи:
    1. На дно формы для запекания нанести тонкий слой мясного соуса.
    2. Сделайте слой приготовленной лапши для лазаньи.
    3. Нанесите ровный слой смеси сыра рикотта.
    4. Нанесите ровный слой мясного соуса.
    5. Повторите эти слои два раза.
    6. Сверху выложите последний слой лапши, соуса, моцареллы и сыра пармезан.

    9. Охладить перед нарезкой или охлаждением

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

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

    Как долго должна стоять лазанья перед нарезкой?

    Оставьте лазанью без крышки на 15-20 минут, чтобы избежать неаккуратного беспорядка.

    Или приготовьте лазанью за день до подачи и разогрейте перед подачей.

    10. Отрегулируйте рецепт на большой высоте

    Если вы живете на большой высоте, отрегулируйте рецепт (ингредиенты и температуру духовки).

    Совет для лазаньи: Используйте лапшу для лазаньи без выпечки, чтобы впитать лишнюю жидкость, и оставьте лазанью на 30 минут после приготовления, чтобы впитать лишнюю влагу.

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

    Чтобы исправить водянистую лазанью, просто слейте лишнюю жидкость из формы для лазаньи. Затем повторно запечь лазанью в течение 10 минут в духовке. Не накрывайте форму для лазаньи фольгой, это не позволит лишней влаге испариться. По возможности снимите верхний сырный слой перед повторной выпечкой, это предотвратит подгорание сыра, а также позволит влаге испариться из формы. Через 7 минут осторожно снова положите верхний слой сыра, добавьте дополнительный слой тертого сыра моцарелла и дайте сыру подрумяниться.

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

    Если ничего не помогает, переделайте свою лазанью, приготовив жареную лазанью по-южному. Мука и панировочные сухари впитают часть лишней влаги.

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

    Или вы можете приготовить изысканный салат из капусты , посыпав его полосками лазаньи и сыром. Добавьте панировочные сухари для некоторых crunch factor !

    Знаете ли вы?

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

    Вот простая традиционная лазанья. Всем нужен рецепт лазаньи !

    Делаете свою первую лазанью? Хотите поразить всех своими кулинарными способностями?

    Вот все, что вам нужно знать, чтобы испечь лучшую лазанью!

    Совет по приготовлению лазаньи: Прочитайте весь рецепт один раз или дважды  прежде чем начать.

    Скорее всего, вы будете избегать сухой или водянистой лазаньи!

    Легко, сытно, красиво.

    Как и ваша бабушка, мы использовали традиционный магазинный соус и листы пасты в коробках.

    Это экономит массу времени не жертвуя любой аромат .

    • Доходность: 8 порций
    • . оливкового масла экстра-класса, плюс еще немного для сбрызгивания
    • 2 фунта говяжьего фарша
    • 2 банки (32-0 унций) маринара
    • 16 унций. рикотта из цельного молока
    • 1/2 чашки свеженатертого пармезана
    • 2 чайные ложки нарезанной петрушки для украшения
    • 1 большое яйцо
    • 2 фунта. тертой моцареллы
    • 4 измельченных зубчика чеснока
    • 2 ч. л. сушеный орегано
    • Соль и перец по вкусу

    Все, что вам нравится в традиционной лазанье.

    Возможно, это лучшая закуска и праздничный гарнир всех времен.

    Лазанья Совет: Оливковое масло первого отжима стоит дорого, покупайте оптом, чтобы сэкономить деньги.

    Указания

    1. Разогрейте духовку до 375º. В большой кастрюле с подсоленной кипящей водой отварите пасту в соответствии с инструкцией на упаковке до состояния al dente. Откиньте лапшу на дуршлаг. Сбрызните оливковым маслом, чтобы лапша не слиплась.
    2. Приготовьте говяжий фарш на среднем огне в смазанной маслом сковороде. Разбить деревянной ложкой. Снимите с огня и слейте лишний жир. Верните говядину в сковороду и добавьте чеснок, орегано, соль и перец. Перемешайте, затем добавьте соус маринара. Постоянно помешивайте, пока не прогреется.
    3. Смешайте рикотту, 1/4 стакана пармезана и яйцо в большой миске, приправьте солью и перцем. Отложите.
    4. В большой форме для запекания равномерно распределите четверть мясного соуса по дну формы, затем положите один слой лапши для лазаньи, слой смеси рикотты, один слой моцареллы и слой мяса соус. Повторите слои, покрыв последний слой лапши мясным соусом, пармезаном и моцареллой.
    5. Накройте фольгой и запекайте 15 минут, затем увеличьте температуру до 400º и запекайте без крышки 18–20 минут.
    6. Прежде чем нарезать лазанью, дайте ей застыть, чтобы не образовалась водянистая масса.

    Как сделать так, чтобы лазанья не развалилась?

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

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

    Сколько слоев должно быть у лазаньи?

    Лазанья должна состоять как минимум из трех слоев. Используйте форму для лазаньи размером 13 x 9 дюймов.

    Начните с слоя мясной начинки на дне, затем слоя лапши, а затем слоя рикотты и сыра моцарелла. Повторяйте, пока у вас не будет как минимум 3 слоя.

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

    Слой #1 : Мясная начинка

    Начните с небольшого количества мясной начинки на дне формы для выпечки, чтобы лазанья оставалась влажной и предотвращает прилипание нижнего слоя лапши для лазаньи.

    • Что касается других слоев мясной начинки, не делайте их слишком толстыми! Это может привести к тому, что ваша лазанья развалится при подаче и еде.
    • Убедитесь, что все мясо полностью приготовлено, прежде чем добавлять его в лазанью.
    • Слишком много (или жидкое) мясного соуса может привести к водянистой лазанье лапшу и разложите их в форме для запекания, слегка перекрывая их.

      Покройте все дно формы лапшой для лазаньи.

      Советы по использованию отварной лапши для лазаньи:

      • Дайте ей остыть в течение нескольких минут
      • Не оставляйте лапшу слишком долго после охлаждения, она слипнется
      • Лапша для лазаньи, выступающая за края формы, может высушите, поэтому нарежьте или положите в форму перед выпеканием
      • Не переваривайте лапшу для лазаньи. Ошибитесь на стороне недоготовки их, вы будете готовить их снова в горячей духовке.
      • После того, как лапша сливается, положите каждую лапшу на смазанный маслом противень, чтобы избежать образования комков.

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

      • Разломайте ее, чтобы она подошла по форме, а не внахлест, так как перекрывающиеся части могут затвердеть во время выпекания.
      • Используйте немного больше соуса. Лапша без варки впитает больше влаги во время выпечки.

      Слой №3: сыр рикотта

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

      Используйте столько сыра, чтобы покрыть предыдущий слой.

      • Основной причиной супообразной лазаньи является сырая рикотта. Процедить рикотту через марлю или сито, чтобы удалить лишнюю жидкость.

      Слой #4: сыр моцарелла

      Сверху посыпать тертой моцареллой.

      Слои #5-#12

      Повторить! (еще 2 раза)

      Вот как выглядят все 12 (перекрывающихся) слоев лазаньи:

      1. Тонкая мясная начинка (нижний слой)
      2. Noodles
      3. Ricotta
      4. Mozzarella
      5. Meat filling
      6. Noodles
      7. Ricotta
      8. Mozzarella
      9. Meat filling
      10. Noodles
      11. Ricotta
      12. Mozzarella (top layer)

      Lasagna Top Layer

      • All of the Слои лапши для лазаньи должны быть слегка перекрыты (включая верхний слой)
      • Оставьте немного сыра моцарелла , чтобы сбрызнуть сверху.
      • Посыпать сыром пармезан!

      Когда лазанья остынет, украсьте свежей нарезанной петрушкой (по желанию).

      Как долго следует оставлять лазанью в духовке?

      Накройте форму для лазаньи алюминиевой фольгой. Выпекать при температуре 400 ° F — в предварительно разогретой духовке — от 40 до 50 минут.

      Снимите фольгу; запекайте без крышки еще 10 минут или пока сыр не начнет пузыриться и не начнет приобретать коричневый цвет.

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

      1. Добавление более 12 (перекрывающихся) слоев может привести к тому, что ваша лазанья развалится, и лазанья может получиться водянистой.
      2. Лазанью чаще всего запекают в духовке, поэтому не забудьте предварительно разогреть духовку.
      3. Если оставить лазанью открытой в духовке, она станет сухой. накройте форму для лазаньи фольгой. Когда лазанья пропечется наполовину, снимите фольгу, чтобы верх подрумянился.
      4. Когда блюдо полностью приготовлено, но верх все еще выглядит бледным, включите жаровню.
      5. Следите за запеканкой, она может быстро сгореть.
      6. Не переваривайте лапшу. Лапша нуждается в структуре, поэтому она не может быть слишком мягкой.
      7. Смажьте их маслом. Чтобы лапша для лазаньи не слипалась, после того, как вы ее слили, смажьте ее оливковым маслом и положите на противень, чтобы она остыла.
      8. Слить говядину. Чтобы лазанья не получилась водянистой, слейте жир со сковороды.
      9. Приправить смесь из рикотты. Смесь рикотты на вкус пресная. Не забудьте приправить солью, перцем, орегано, петрушкой или пармезаном!
      10. Если есть выбор, всегда добавляйте сыр сверху.

      #UltimateLasagna

      Знаете ли вы?

      Лазанья возникла в  Италии  в Средние века.

      Первый записанный рецепт появился в Liber de Coquina (Книге кулинарии) в начале 14-го века. – Википедия

      Почему моя лазанья такая водянистая?

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

      Почему лазанья готовится так долго?

      Количество слоев и количество влаги в сердцевине ингредиентов лазаньи определяют продолжительность приготовления лазаньи.

      Лапша и мясо в основном уже приготовлены. Таким образом, вы просто готовите  до тех пор, пока сыр не расплавится.

      Листы для лазаньи нужно готовить перед выпечкой?

      Нет. Просто убедитесь, что ваш мясной соус и соус для сыра/бешамель немного жиже.

      Ближе к концу выпечки, если необходимо, накройте верх фольгой, чтобы он не подгорел.

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

      Как долго замачивать лапшу для лазаньи без варки?

      Поместите листы лазаньи без варки в форму для запекания и залейте горячей водой из-под крана. Вот и все! Оставьте его на столе на 15 минут, пока вы готовите другие слои для лазаньи.

      Сколько времени готовить лазанью, если она была охлаждена?

      Разогрейте духовку до 375°. Достаньте лазанью из холодильника, пока духовка нагревается.

      Выпекать под крышкой, 45 минут. Запекайте без крышки, пока сыр не расплавится, 10–15 минут.

      Можно ли собрать лазанью и приготовить позже?

      Лазанью можно собрать и приготовить на следующий день.

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

      Заранее приготовленные блюда очень удобны.

      Как исправить недоваренную лазанью?

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

      Накройте форму для выпечки алюминиевой фольгой или крышкой. Вернуть в духовку и выпекать недолго.

      Продолжайте выпекать, пока вся жидкость не впитается.

      Лазанья не должна быть сухой или хрустящей . №

      Чтобы лазанья всегда была идеально влажной, накрывайте форму для лазаньи фольгой во время выпекания.

      Вам не нужно держать его накрытым все время.

      Как приготовить сухую лазанью?
      1. Подсушенные листы лазаньи размягчить, s погрузив их в один слой в кипящую воду на 5 мин. Замачивание улучшает текстуру, даже если на упаковке указано, что листы лазаньи не следует предварительно готовить. Хорошо слейте воду, чтобы лазанья не была водянистой.
      2. Чтобы запеканка для лазаньи оставалась влажной, первый слой вашей лазаньи должен быть соусом. Это также гарантирует, что лапша не прилипнет к сковороде.
      3. Чтобы верхний  слой лазаньи не стал твердым , добавьте немного бешамель или томатного соуса перед тем, как покрыть его сыром.
      4. Если верхний слой вашей лазаньи состоит из макарон, смажьте листы лазаньи маслом , чтобы они не высыхали. И накрыть фольгой.
      5. Чтобы закрепить уже приготовленную сухую лазанью, налейте немного томатного соуса , соуса бешамель или говяжьего бульона. Затем накройте противень и верните в духовку тоже выпекать кратко . Продолжайте выпекать, пока жидкость не впитается.
      6. Вы также можете превратить его в другое блюдо , например: томатный суп для лазаньи, сэндвичи с жареным сыром для лазаньи или соус для лазаньи.
      7. Чтобы разогреть лазанью , не высушивая ее, сбрызнуть сверху лазаньи двумя столовыми ложками воды и накрыть фольгой. Поместите лазанью в духовку и нагревайте в течение 15 минут или пока она полностью не прогреется.

      Нужна ли лазанья отдых?

      Оставьте лазанью без крышки на 15 минут, чтобы избежать образования водянистой массы.

      Как сделать верхний слой лазаньи твердым?

      Смажьте верхние листы лазаньи небольшим количеством масла, чтобы они не высыхали.

      Сыр содержит масло, и это поможет сохранить лапшу мягкой сверху. Также накройте фольгой, чтобы сохранить влагу.

      Как произносится «лазанья»?

      лах-зан-йах или лух-зан-йух. G молчит.

      Можете ли вы винить свою духовку в жидкой лазанье?

      Некоторые печи нагреваются неравномерно и/или отображают неправильную температуру. Плохая печь, плохая!

      Попробуйте тостер , если в вашей газовой духовке есть точки перегрева, колебания температуры или циферблат не точен.

      Как убедиться, что лазанья не водянистая?

      Шеф-повар 16 января 2012 г. 1:24

      Из нашей серии Ask the Chef .

      В: У меня вопрос о лазанье. Как приготовить жесткую лазанью с кусочками? Моя мама всегда готовит суповую лазанью; он падает с твоей вилки. Может быть, ей нужно засунуть его в холодильник на ночь?

        –Travis

      A: Суповая лазанья возникает либо из-за того, что мокрая лапша не была слита должным образом, либо из-за того, что лазанья была покрыта слишком большим количеством (жидким влажным) соусом. Хотя вы можете приготовить лазанью заранее и охладить или заморозить ее, это не уменьшит содержание влаги. Проблема, вероятно, в том, что лапша слишком влажная во время сборки лазаньи.

      Лучше всего слить воду и промыть приготовленную лапшу с помощью дуршлага. Затем аккуратно высушите каждую лапшу, положив ее на кусок пергамента или вощеной бумаги, промокнув бумажным полотенцем и дав высохнуть на воздухе, пока не испарится большая часть воды. Вы также можете приготовить лазанью с лапшой без варки; Хитрость заключается в том, чтобы обеспечить много соуса, чтобы влага впиталась в лапшу во время процесса выпечки. Лапша без варки впитает водянистый соус и поможет устранить мокрую лапшу.
       
       

      Самые популярные

      Еще

      4 Вт

      Тенденции 3 октября 2022 г. 14:30

      Ароматы осени — помимо тыквы и пекана

      3 октября 2022 г., 14:30 · Автор: Кей Логсдон

      Раньше ароматы осени были корицей и мускатным орехом, периодически смешанными с шалфеем, жареным орехом пекан и, конечно же, тыквой. Не иметь (…)

      27 сентября

      Рецепты 27 сентября 2022 г. 23:09

      Наши лучшие рецепты на Хэллоуин: тыквенный пирог, печенье и коктейли

      27 сентября 2022 г., 23:09 · Автор: Джеймс Оливер Кьюри

      Рецепты играют утилитарную роль в День Благодарения; мы рассчитываем получить определенные блюда — индейку, фарш, клюквенный соус — в обязательном порядке (…)

      20 сентября

      Рецепты20 сентября 2022 г.
      13:17

      Австралийский тыквенный суп

      20 сентября 2022 г., 13:17 · Автор: Редактор FoodChannel

      Если вы еще не ели тыквенный суп, вы упускаете восхитительный ужин. Этот пикантный суп идеально подходит для тех, кто впервые (…)

      13 сен

      Отзывы 13 сентября 2022 г. 23:58

      Теория TikTok: правило китайского ресторана 3,5 звезды

      13 сентября 2022 г., 23:58 · Автор: Джеймс Оливер Кьюри

      В течение почти 100 лет звездная система была простым способом оценить, насколько хорош ресторан: чем больше, тем лучше. Никакой путаницы. (…)

      13 сен

      Рецепты13 сентября 2022 г., 12:27

      Чатемская треска, крабы, фава и маринованные мидии

      13 сентября 2022 г., 12:27 · Автор: Дэмион МакДанн

      «Я люблю треску! Я помню, как рос и рыбачил по Окленду по выходным с моим дядей или отцом. Очень часто рыбачу с (…)

      07 сент.

      Тенденции 7 сентября 2022 г. 9:26 вечера

      Осенний превью: 9 гастрономических шоу скоро

      7 сентября 2022 г. , 21:26 · Автор: Джеймс Оливер Кьюри

      Когда вы смотрите безумно захватывающие видео в TikTok, Instagram и Youtube, легко забыть, что много еды на телевидении — это (…)

      28 августа

      Рецепты28 августа 2022 г. 7:53

      Банановый хлеб мисо

      28 августа 2022 г., 7:53 · Автор: приглашенный участник

      Кен Орингер и Джейми Биссонетт из Little Donkey в Кембридже, штат Массачусетс, добавляют мисо в свой банановый хлеб, вызывающий привыкание, чтобы придать ему (…)

      23 августа

      Как 23 августа 2022 г. 19:02

      14 кулинарных лайфхаков TikTok, которые изменят то, как вы готовите (и едите)

      23 августа 2022 г., 19:02 · Автор: Джеймс Оливер Кьюри

      Два слова, которые больше всего нравятся занятым домашним поварам: быстро и легко. Поэтому неудивительно, что мы видим «быстро и просто» в списке рецептов (…)

      .

      23 августа

      Тенденции 23 августа 2022 г. 10:00

      Коктейли и рецепты для вечеринок «Игра престолов» и «Дом дракона»

      23 августа 2022 г.

Вам может понравится

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *