我想建立一个计算字符串的Keras模型。如果我这样做:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=10, input_shape=(10,), activation='softmax'))
它工作得很好。我可以看到model.summary()
。
但是,当我用ast.literal_eval()
添加层时
from keras.models import Sequential
from keras.layers import Dense
import ast
model = Sequential()
code = "model.add( Dense( input_shape=(10,), units=10, activation='softmax' ) )"
ast.literal_eval(code)
它让我下一个ValueError
:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python3.5/ast.py", line 83, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x7efc40c90e10>
如果我使用eval
而不是ast.literal_eval
,它也可以工作。
我用的是Python3.5。
一个大错误:
literal_eval
只对文本有效。在这种情况下,我有一个呼叫。函数
literal_eval
首先解析字符串。来自/usr/lib/python3.5/ast.py:38-46行
此时,
node_or_string
是Expression
的一个实例。然后,literal_eval
得到尸体。来自/usr/lib/python3.5/ast.py:47-48行
最后,
literal_eval
检查主体的类型(node_or_string
)。来自/usr/lib/python3.5/ast.py:49-84行
如果初始代码是
ast.literal_eval('1+1')
(例如),那么现在node_or_string
将是BinOp
的一个实例。但在以下情况下:主体将是
Call
的一个实例,它不出现在函数的有效类型中。例如:
解决方案
到目前为止,我找到的最好的解决方案是不直接使用
eval
,而是手动执行该过程。使用此功能:现在它工作了:
相关问题 更多 >
编程相关推荐