И ваша модель не будет обновляться:
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]?
Для вашей проблемы со словарями легче работать, чем со списками кортежей. В этом случае вы можете комбинировать сопоставления с помощью словарного понимания.
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}}
Вы можете временно преобразовать каждое значение в 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())}