qnd module
1021 |Quick and Dirty TensorFlow command framework
1022 | 1023 | 1024 |"""Quick and Dirty TensorFlow command framework"""
1026 |
1027 | from .flag import *
1028 | from .infer import def_infer
1029 | from .train_and_evaluate import def_train_and_evaluate
1030 | from .evaluate import def_evaluate
1031 | from .serve import def_serve
1032 |
1033 | __all__ = ["FLAGS", "add_flag", "add_required_flag", "FlagAdder",
1034 | "def_train_and_evaluate", "def_evaluate", "def_infer", "def_serve"]
1035 | __version__ = "0.1.3"
1036 |
1037 | Module variables
1043 |var FLAGS
1045 | 1046 | 1047 |Functions
1053 | 1054 |def add_flag(
name, *args, **kwargs)
1057 |Add a flag.
1063 |Added flags can be accessed by FLAGS module variable.
1064 | (e.g. FLAGS.my_flag_name)
-
1066 |
- Args
-
1067 |
name: Flag name. Real flag name will be"--{}".format(name).
1068 | *args,**kwargs: The rest arguments are the same as 1069 |argparse.ArgumentParser.add_argument().
1070 |
1072 |
def add_flag(name, *args, **kwargs):
1077 | """Add a flag.
1078 |
1079 | Added flags can be accessed by `FLAGS` module variable.
1080 | (e.g. `FLAGS.my_flag_name`)
1081 |
1082 | - Args
1083 | - `name`: Flag name. Real flag name will be `"--{}".format(name)`.
1084 | - `*args`, `**kwargs`: The rest arguments are the same as
1085 | `argparse.ArgumentParser.add_argument()`.
1086 | """
1087 | global _FLAG_NAMES
1088 |
1089 | if 'help' not in kwargs:
1090 | kwargs['help'] = '(no description)'
1091 |
1092 | if name not in _FLAG_NAMES:
1093 | _FLAG_NAMES.add(name)
1094 | gargparse.add_argument("--" + name, *args, **kwargs)
1095 |
1096 | def add_required_flag(
name, *args, **kwargs)
1105 |Add a required flag.
1111 |Its interface is the same as add_flag() but required=True is set by
1112 | default.
def add_required_flag(name, *args, **kwargs):
1117 | """Add a required flag.
1118 |
1119 | Its interface is the same as `add_flag()` but `required=True` is set by
1120 | default.
1121 | """
1122 | add_flag(name, *args, required=True, **kwargs)
1123 |
1124 | def def_evaluate(
batch_inputs=True, prepare_filename_queues=True)
1133 |Define evaluate() function.
See also help(def_evaluate()).
-
1141 |
-
1142 |
Args
1143 |-
1144 |
batch_inputs: Same asdef_train_and_evaluate()'s.
1145 | prepare_filename_queues: Same asdef_train_and_evaluate()'s.
1146 |
1148 | -
1149 |
Returns
1150 |-
1151 |
evaluate()function.
1152 |
1154 |
def def_evaluate(batch_inputs=True, prepare_filename_queues=True):
1159 | """Define `evaluate()` function.
1160 |
1161 | See also `help(def_evaluate())`.
1162 |
1163 | - Args
1164 | - `batch_inputs`: Same as `def_train_and_evaluate()`'s.
1165 | - `prepare_filename_queues`: Same as `def_train_and_evaluate()`'s.
1166 |
1167 | - Returns
1168 | - `evaluate()` function.
1169 | """
1170 | add_output_dir_flag()
1171 |
1172 | estimator = def_estimator(distributed=False)
1173 | def_eval_input_fn = def_def_infer_input_fn(batch_inputs,
1174 | prepare_filename_queues)
1175 |
1176 | def evaluate(model_fn, input_fn):
1177 | """Evaluate a model with data sample fed by `input_fn`.
1178 |
1179 | - Args
1180 | - `model_fn`: Same as `train_and_evaluate()`'s.
1181 | - `input_fn`: Same as `eval_input_fn` argument of
1182 | `train_and_evaluate()`.
1183 |
1184 | - Returns
1185 | - Evaluation results. See `Evaluable` interface in TensorFlow.
1186 | """
1187 | return estimator(model_fn, FLAGS.output_dir).evaluate(
1188 | input_fn=def_eval_input_fn(input_fn))
1189 |
1190 | return evaluate
1191 |
1192 | def def_infer(
batch_inputs=True, prepare_filename_queues=True)
1201 |Define infer() function.
See also help(def_infer()).
-
1209 |
-
1210 |
Args
1211 |-
1212 |
batch_inputs: Same asdef_train_and_evaluate()'s.
1213 | prepare_filename_queues: Same asdef_train_and_evaluate()'s.
1214 |
1216 | -
1217 |
Returns
1218 |-
1219 |
infer()function.
1220 |
1222 |
def def_infer(batch_inputs=True, prepare_filename_queues=True):
1227 | """Define `infer()` function.
1228 |
1229 | See also `help(def_infer())`.
1230 |
1231 | - Args
1232 | - `batch_inputs`: Same as `def_train_and_evaluate()`'s.
1233 | - `prepare_filename_queues`: Same as `def_train_and_evaluate()`'s.
1234 |
1235 | - Returns
1236 | - `infer()` function.
1237 | """
1238 | add_output_dir_flag()
1239 |
1240 | estimator = def_estimator(distributed=False)
1241 | def_infer_input_fn = def_def_infer_input_fn(batch_inputs,
1242 | prepare_filename_queues)
1243 |
1244 | def infer(model_fn, input_fn):
1245 | """Infer labels or regression values from features of samples fed by
1246 | `input_fn`.
1247 |
1248 | - Args
1249 | - `model_fn`: Same as `train_and_evaluate()`'s.
1250 | - `input_fn`: Same as `train_input_fn` and `eval_input_fn`
1251 | arguments of `train_and_evaluate()` but returns only features.
1252 |
1253 | - Returns
1254 | - Generator of inferred label(s) or regression value(s) for each
1255 | sample.
1256 | """
1257 | return estimator(model_fn, FLAGS.output_dir).predict(
1258 | input_fn=def_infer_input_fn(input_fn))
1259 |
1260 | return infer
1261 |
1262 | def def_serve(
)
1271 |Define serve() function.
See also help(def_serve()).
-
1279 |
- Returns
-
1280 |
serve()function.
1281 |
1283 |
def def_serve():
1288 | """Define `serve()` function.
1289 |
1290 | See also `help(def_serve())`.
1291 |
1292 | - Returns
1293 | - `serve()` function.
1294 | """
1295 | add_output_dir_flag()
1296 |
1297 | create_estimator = def_estimator(distributed=False)
1298 |
1299 | def serve(model_fn, preprocess_fn, port=80):
1300 | """Serve as a HTTP server.
1301 |
1302 | - Args
1303 | - `model_fn`: Same as `train_and_evaluate()`'s.
1304 | - `preprocess_fn`: A function to preprocess server request bodies
1305 | in JSON.
1306 | """
1307 | estimator = create_estimator(model_fn, FLAGS.output_dir)
1308 |
1309 | class Handler(http.server.BaseHTTPRequestHandler):
1310 | def do_POST(self):
1311 | self.send_response(200)
1312 | self.send_header('Content-type', 'application/json')
1313 | self.end_headers()
1314 |
1315 | inputs = json.loads(self.rfile.read(
1316 | int(self.headers['Content-Length'])))
1317 |
1318 | predictions = _make_json_serializable(
1319 | estimator.predict(input_fn=lambda: preprocess_fn(inputs),
1320 | as_iterable=False))
1321 |
1322 | logging.info('Prediction results: {}'.format(predictions))
1323 |
1324 | self.wfile.write(json.dumps(predictions).encode())
1325 |
1326 | http.server.HTTPServer(('', port), Handler).serve_forever()
1327 |
1328 | return serve
1329 |
1330 | def def_train_and_evaluate(
batch_inputs=True, prepare_filename_queues=True, distributed=False)
1339 |Define train_and_evaluate() function.
See also help(def_train_and_evaluate()).
-
1347 |
-
1348 |
Args
1349 |-
1350 |
batch_inputs: IfTrue, create batches from Tensors returned from 1351 |train_input_fn()andeval_input_fn()and feed them to a model.
1352 | prepare_filename_queues: IfTrue, create filename queues for 1353 | train and eval data based on file paths specified by command line 1354 | arguments.
1355 | distributed: IfTrue, configure command line arguments to train 1356 | and evaluate models on a distributed system.
1357 |
1359 | -
1360 |
Returns
1361 |-
1362 |
train_and_evaluate()function.
1363 |
1365 |
def def_train_and_evaluate(batch_inputs=True,
1370 | prepare_filename_queues=True,
1371 | distributed=False):
1372 | """Define `train_and_evaluate()` function.
1373 |
1374 | See also `help(def_train_and_evaluate())`.
1375 |
1376 | - Args
1377 | - `batch_inputs`: If `True`, create batches from Tensors returned from
1378 | `train_input_fn()` and `eval_input_fn()` and feed them to a model.
1379 | - `prepare_filename_queues`: If `True`, create filename queues for
1380 | train and eval data based on file paths specified by command line
1381 | arguments.
1382 | - `distributed`: If `True`, configure command line arguments to train
1383 | and evaluate models on a distributed system.
1384 |
1385 | - Returns
1386 | - `train_and_evaluate()` function.
1387 | """
1388 | add_output_dir_flag()
1389 |
1390 | def_experiment_fn = def_def_experiment_fn(batch_inputs,
1391 | prepare_filename_queues,
1392 | distributed)
1393 |
1394 | def train_and_evaluate(model_fn,
1395 | train_input_fn,
1396 | eval_input_fn=None,
1397 | serving_input_fn=None):
1398 | """Train and evaluate a model with features and targets fed by
1399 | `input_fn`s.
1400 |
1401 | - Args
1402 | - `model_fn`: A function to construct a model.
1403 | - Types of its arguments must be one of the following:
1404 | - `Tensor, ...`
1405 | - `Tensor, ..., mode=ModeKeys`
1406 | - Types of its return values must be one of the following:
1407 | - `Tensor, Tensor, Operation, eval_metric_ops=dict`
1408 | (predictions, loss, train_op, and eval_metric_ops (if any))
1409 | - `ModelFnOps`
1410 | - `train_input_fn`, `eval_input_fn`: Functions to create input
1411 | Tensors fed into the model. If `eval_input_fn` is `None`,
1412 | `train_input_fn` will be used instead.
1413 | - Types of its arguments must be one of the following:
1414 | - `QueueBase` (a filename queue)
1415 | - No argument if `prepare_filename_queues` of
1416 | `def_train_and_evaluate()` is `False`.
1417 | - Types of its return values must be one of the following:
1418 | - `Tensor, Tensor` (features and targets)
1419 | - `dict, dict` (features and targets)
1420 | - The keys in `dict` objects must match with argument
1421 | names of `model_fn`.
1422 |
1423 | - Returns
1424 | - Return value of `tf.contrib.learn.python.learn.learn_runner.run()`.
1425 | """
1426 | return run(def_experiment_fn(model_fn,
1427 | train_input_fn,
1428 | eval_input_fn,
1429 | serving_input_fn),
1430 | FLAGS.output_dir)
1431 |
1432 | return train_and_evaluate
1433 |
1434 | Classes
1441 | 1442 |class FlagAdder
1444 | 1445 | 1446 |Manage addition of flags.
class FlagAdder:
1451 | """Manage addition of flags."""
1452 |
1453 | def __init__(self):
1454 | """Create a `FlagAdder` instance."""
1455 | self._flags = []
1456 |
1457 | def add_flag(self, name, *args, **kwargs):
1458 | """Add a flag.
1459 |
1460 | See `add_flag()`.
1461 | """
1462 | add_flag(name, *args, **kwargs)
1463 | self._flags.append(kwargs.get("dest") or name)
1464 |
1465 | def add_required_flag(self, name, *args, **kwargs):
1466 | """Add a required flag.
1467 |
1468 | See `add_required_flag()`.
1469 | """
1470 | self.add_flag(name, *args, required=True, **kwargs)
1471 |
1472 | @property
1473 | def flags(self):
1474 | """Get added flags.
1475 |
1476 | - Returns
1477 | - `dict` of flag names to values added by a `FlagAdder` instance.
1478 | """
1479 | return {flag: getattr(FLAGS, flag) for flag in self._flags}
1480 |
1481 | Ancestors (in MRO)
1487 |-
1488 |
- FlagAdder 1489 |
- builtins.object 1490 |
Static methods
1492 | 1493 |def __init__(
self)
1496 |Create a FlagAdder instance.
def __init__(self):
1506 | """Create a `FlagAdder` instance."""
1507 | self._flags = []
1508 |
1509 | def add_flag(
self, name, *args, **kwargs)
1518 |Add a flag.
1524 |See add_flag().
def add_flag(self, name, *args, **kwargs):
1529 | """Add a flag.
1530 | See `add_flag()`.
1531 | """
1532 | add_flag(name, *args, **kwargs)
1533 | self._flags.append(kwargs.get("dest") or name)
1534 |
1535 | def add_required_flag(
self, name, *args, **kwargs)
1544 |Add a required flag.
1550 |See add_required_flag().
def add_required_flag(self, name, *args, **kwargs):
1555 | """Add a required flag.
1556 | See `add_required_flag()`.
1557 | """
1558 | self.add_flag(name, *args, required=True, **kwargs)
1559 |
1560 | Instance variables
1566 |var flags
1568 | 1569 | 1570 | 1571 | 1572 |Get added flags.
1573 |-
1574 |
- Returns
-
1575 |
dictof flag names to values added by aFlagAdderinstance.
1576 |
1578 |
3 |