我正在尝试使用 Google Colab 来使用张量处理单元(TPU)来训练神经网络。 Tensorflow刚刚发布了一个主要版本2.0,因此我正在尝试在Tensorflow 2.0中做到这一点。我尝试了以下三个指南,但是所有指南都是为Tensorflow 1.14-编写的,但在Tensorflow 2.0中失败了:
1):按照指南TPUs in Colab,我收到了错误消息:
var dir1 = './screenshots';
var dir2 = './pdfs';
const fs = require('fs');
if (!fs.existsSync(dir1)) {
fs.mkdirSync(dir1);
}
if (!fs.existsSync(dir2)) {
fs.mkdirSync(dir2);
}
function readURLFile(path) {
return fs.readFileSync(path, 'utf-8')
.split('\n')
.map((elt) => {
const url = elt.split(',')[1].replace('\r', '');
return `http://${url.toLowerCase()}`;
});
}
const puppeteer = require('puppeteer');
(async () => {
const startDate = new Date().getTime();
const USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3239.108 Safari/537.36';
const urls = readURLFile('./UNVurls.csv');
const browser = await puppeteer.launch({
headless: true
});
for (let url of urls) {
console.log(`Visiting url: ${url}`);
let page = await browser.newPage();
try {
await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 });
await page.goto('http://www.oldwestbury.edu')
// await page.goto(url, {
// waitUntil: 'networkidle2',
// timeout: 0
// });
let fileName = url.replace(/(\.|\/|:|%|#)/g, "_");
if (fileName.length > 100) {
fileName = fileName.substring(0, 100);
}
await page.waitForSelector('title');
await page.screenshot({
path: `./screenshots/${fileName}.jpeg`,
omitBackground: true
});
await page.emulateMedia('screen');
await page.pdf({
path: `./pdfs/${fileName}.pdf`,
pageRanges: "1",
format: 'A4',
printBackground: true
});
} catch (err) {
console.log(`An error occured on url: ${url}`);
} finally {
await page.close();
}
}
await browser.close();
console.log(`Time elapsed ${Math.round((new Date().getTime() - startDate) / 1000)} s`);
})();
(参考文献:,其中tf.Session(tpu_address)为会话:)
2)根据指南Simple Classification Model using Keras on Colab TPU,我遇到相同的错误
3),按照指南cloud_tpu_custom_training,我收到了错误消息:
input = [1,3,1,2,1,7]
num = 3
count = 0
for i in range(1,len(input)):
while input[i] <= input[i-1]:
input[i] += num
count +=1
print (count) # returns 5
print (input) # returns [1, 3, 4, 5, 7, 10]
(参考文献: resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu = TPU_WORKER))
有人在Tensorflow 2.0中使用TPU训练神经网络的例子吗?
编辑:这个问题似乎也在github上引发:InvalidArgumentError: Unable to find a context_id matching the specified one #1
答案 0 :(得分:1)
首先,本教程中给出的代码与2.x不兼容
针对错误
AttributeError:模块'tensorflow'没有属性'Session'
由于不推荐使用tf.compat.v1.Session()
,因此您需要使用tf.session
。
tf.contrib.cluster_resolver
代替tf.distribute.cluster_resolver
请参考Tensorflow Addon-repo将代码从1.x转换为2.x兼容。
答案 1 :(得分:0)
在运行代码之前,
转到
Edit --> Notebook Settings
在该选择下
Hardware Accelerator --> TPU
答案 2 :(得分:0)
Tensorflow 2.0并不真正与Tensorflow 1.X代码向后兼容。这些版本之间Tensorflow的工作方式有很多变化,因此我强烈建议阅读有关如何迁移代码的官方指南:
https://www.tensorflow.org/guide/migrate#estimators
我会说,自动转换脚本尽管在技术上取得了成功,但仅将我的代码更改为Tensorflow 1.X代码的兼容版本-如果您想使用任何实际的Tensorflow 2.0功能,则可能需要更改手动编写代码。
答案 3 :(得分:0)
最后在Tensorflow 2.1.0中添加了对TPU的支持(截至2020年1月8日)。从此处的发行说明https://github.com/tensorflow/tensorflow/releases/tag/v2.1.0:
Keras .compile,.fit,.evaluate和.predict的实验支持适用于Cloud TPU,Cloud TPU,适用于所有类型的Keras模型(顺序模型,功能模型和子类模型)。
该教程位于此处:https://www.tensorflow.org/guide/tpu
为完整起见,我将在此处添加演练:
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
import os
import tensorflow_datasets as tfds
# Distribution strategies
resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)
# MNIST model
def create_model():
return tf.keras.Sequential(
[tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)])
# Input datasets
def get_dataset(batch_size=200):
datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True,
try_gcs=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
def scale(image, label):
image = tf.cast(image, tf.float32)
image /= 255.0
return image, label
train_dataset = mnist_train.map(scale).shuffle(10000).batch(batch_size)
test_dataset = mnist_test.map(scale).batch(batch_size)
return train_dataset, test_dataset
# Create and train a model
strategy = tf.distribute.experimental.TPUStrategy(resolver)
with strategy.scope():
model = create_model()
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['sparse_categorical_accuracy'])
train_dataset, test_dataset = get_dataset()
model.fit(train_dataset,
epochs=5,
validation_data=test_dataset,steps_per_epoch=50)
请注意,当我按原样运行tensorflow教程中的代码时,出现以下错误。我已通过在model.fit()
中添加steps_per_epoch参数来更正此问题ValueError:无法从数据中推断出步数,请传递steps_per_epoch参数。