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

И ваша модель не будет обновляться:

import tensorflow as tf

w = tf.get_variable('w', initializer=42.)
cost_op = tf.square(w)
train_op = tf.train.GradientDescentOptimizer(0.0).minimize(cost_op)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(10):
        _, cost, value = sess.run([train_op, cost_op, w])
        print(i, cost, value)

дает

(0, 1764.0, 42.0)
(1, 1764.0, 42.0)
(2, 1764.0, 42.0)
(3, 1764.0, 42.0)
(4, 1764.0, 42.0)
(5, 1764.0, 42.0)
(6, 1764.0, 42.0)
(7, 1764.0, 42.0)
(8, 1764.0, 42.0)
(9, 1764.0, 42.0)

как для AdamOptimizer, так и для GradientDescentOptimizer. Мое лучшее предположение - это неградиентное обновление, такое как BatchNorm и / или NaN в ваших данных, вызывающих NaN. Или даже неправильная операция.

Как вы ожидаете получить помощь, не указав свою реализацию в [mcve]?

2
задан Mad Physicist 20 January 2019 в 03:18
поделиться

2 ответа

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

from operator import itemgetter

# create dictionary with all keys set to 0
allkeys = dict.fromkeys(map(itemgetter(0), list1), 0)

# for each year, combine dictionary mappings
dict1 = {k: {**allkeys, **dict(v)} for k, v in dict1.items()}

Вы можете, если хотите, преобразовать обратно в списки кортежей:

res = {k: list(v.items()) for k, v in dict1.items()}

Результат для опции вложенного словаря:

{2011: {'Debt collection': 5572,
  'Mortgage': 4483,
  'Credit reporting': 0,
  'Checking or savings account': 0,
  'Student loan': 431,
  'Credit card or prepaid card': 0,
  'Bank account or service': 0,
  'Credit card': 0,
  'Consumer Loan': 0},
 2012: {'Debt collection': 0,
  'Mortgage': 0,
  'Credit reporting': 0,
  'Checking or savings account': 0,
  'Student loan': 1632,
  'Credit card or prepaid card': 0,
  'Bank account or service': 0,
  'Credit card': 0,
  'Consumer Loan': 480,
  'Medical loan': 1632,
  'Prepaid card': 83}}
0
ответ дан jpp 20 January 2019 в 03:18
поделиться

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

for k in dict1:
    d = dict(dict1[k])
    dict1[k] = [(item, d.get(item, 0)) for item, _ in list1]

Если вы хотите иметь словарь в выводе, последняя строка практически не меняется:

dict1[k] = {item: d.get(item, 0)) for item, _ in list1}

Или, если порядок имеет значение, и вы используете Python < 3.6:

dict1 = OrderedDict(item, d.get(item, 0)) for item, _ in list1)

Хотя я бы посоветовал вам этого не делать, возможен один вкладыш:

dict1 = {k: [(item, d.get(item, 0)) for item, _ in list1] for k, d in ((k, dict(v)) for k, v in dict1.items())}
0
ответ дан Mad Physicist 20 January 2019 в 03:18
поделиться
Другие вопросы по тегам:

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